繁体   English   中英

Windows上的PHP中的异步popen exec

[英]Asynchronous popen exec in PHP on Windows

我有一个奇怪的问题。 我最近在我们的测试服务器上设置了一个进程,以便从另一个脚本异步调用脚本。 直到最近,它一直在测试期间工作。 在继续之前,让我先介绍一些技术细节。 来自原始脚本的调用看起来像这样(我更新了调用的逻辑):

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仍然在系统路径中
  • 我已经使用调试输出来查看正在进行的异步调用,以及正在使用什么args - 所有内容似乎仍然是正确的。
  • 如果我从Windows系统终端手动调用$ command中包含的命令,它将按预期运行
  • 如果我运行$命令,因为exec会运行它(使用'cmd / S / C'它会失败,抱怨它无法打开php脚本)

令我难以置信的是,上周这次工作正常。 我对代码进行了一些更改(看似无关),甚至在恢复我的更改以查看是否存在问题之后 - 此过程仍然存在。

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

最终我能够通过不使用popen或exec来解决这个问题,看起来在Windows平台上使用PHP时最好避免这些问题 - 如果你试图创建一个异步脚本调用。 相反,我使用PHP中的Windows COM对象支持。

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

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

这里包含WScript.Shell的文档页面,它提供了传递参数效果的官方说明。 虽然我没有停下来对它进行基准测试,但我会说,有趣的是,当我尝试使用exec / popen / etc时,他的进程现在运行得比以前更快。

而不是将输出重定向到nul ,尝试将所有内容重定向到文件。 这应该会告诉你某处是否存在PHP错误:

$outFilePath = "/path/to/file.log";
pclose (popen('start /B cmd /S /C "'.$command.' > ' . $outFilePath . ' 2>' . $outFilePath . ' &"',"r") );

还有什么理由你使用pclose / popen而不是像exec这样更简单的东西?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM