php - Windows 上 PHP 中的异步 popen exec

标签 php windows asynchronous exec

我有一个奇怪的问题。我最近在我们的测试服务器上设置了一个进程来从另一个脚本异步调用一个脚本。它一直在测试期间工作,直到最近。在继续之前,让我给出一些技术细节。来自原始脚本的调用如下所示(我已经更新了调用的逻辑):

exec('cmd/S/C "'.$command.' 1> nul 2>&1"');

其中 $command 是使用以下逻辑创建的:

                $args = array(
                    'php',
                    '"'.getcwd().'{absolute path to a php script}"',
                    escapeshellarg($job_id),
                    escapeshellarg($vhost),
                    escapeshellarg($debug),
                );
                $command = implode(' ', $args);

PHP 版本是 5.3.10,服务器是一个运行 Windows Server 2008 R2 Standard 的主机。

  • 我已验证 php 仍在系统路径中
  • 我已经使用调试输出来查看正在进行的异步调用,以及它使用的参数 - 一切似乎仍然是正确的。
  • 如果我从 Windows 系统终端手动调用 $command 中包含的命令,它会按预期运行
  • 如果我按 exec 运行 $command 的方式运行它(使用“cmd/S/C”它失败并提示它无法打开 php 脚本)

真正让我感到困惑的是,这在上周的这个时候是有效的。我对代码做了一些更改(看似无关),甚至在恢复我的更改以查看是否是问题所在之后 - 这个过程仍然中断。

在这一点上,我很困惑,欢迎任何见解、想法或帮助。

最佳答案

最终我能够通过根本不使用 popen 或 exec 来简单地解决这个问题,似乎在 Windows 平台上使用 PHP 时最好避免这些问题 - 如果您正在尝试创建一个异步脚本调用.相反,我求助于 PHP 中的 Windows COM 对象支持。

$handle = new COM('WScript.Shell');
$handle->Run($command, 0, false);

这会在后台启动进程(隐藏窗口/不打开新窗口)并异步执行 - 即不等待它完成。

包括here是 WScript.Shell 的文档页面,它给出了传递参数的效果的官方描述。虽然我没有停下来对其进行基准测试,但我会说,据传闻,感觉他的进程现在运行速度比我尝试使用 exec/popen/etc 时更快。

关于php - Windows 上 PHP 中的异步 popen exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154506/

相关文章:

asynchronous - 将 TBB 用于非并行任务

c# - async/await 是否可以感知 Android Activity 生命周期?

c++ - 手动检索和存储指向 OpenGL 函数的指针时出现问题

php - 如何修改 WP 管理仪表板(后端)特定页面中的 CSS

php - 阻止 FIREFOX 缓存验证码

php从函数返回json编码的字符串

windows - 我应该使用哪种类型的证书对 Windows 桌面应用程序进行代码签名?

windows - 写入 Windows 安全日志

.net - 我期望在System.Net.Mail.ASyncCompletedEventHandler中收到什么可能的错误?

php - 缓冲递归 foreach 循环输出的函数式编程替代方案