我有一个奇怪的问题。我最近在我们的测试服务器上设置了一个进程,以便从另一个脚本异步调用脚本。直到最近,它一直在测试期间工作。在继续之前,让我先介绍一些技术细节。来自原始脚本的调用看起来像这样(我更新了调用的逻辑):
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的托管盒。
真正让我难以置信的是,上周这次工作正常。我对代码进行了一些更改(看似无关),甚至在还原我的更改后查看是否存在问题 - 此过程仍然存在。
此时我感到神秘,欢迎任何见解,想法或帮助。
答案 0 :(得分:5)
最终我能够通过不使用popen或exec来解决这个问题,看起来在Windows平台上使用PHP时最好避免这些问题 - 如果你试图创建一个异步脚本调用,那么。相反,我使用PHP中的Windows COM对象支持。
$handle = new COM('WScript.Shell');
$handle->Run($command, 0, false);
这会在后台启动进程(隐藏窗口/不会打开新窗口)并以异步方式执行 - 即不等待它完成。
包含here是WScript.Shell的文档页面,它提供了传递参数效果的官方说明。虽然我没有停下来对它进行基准测试,但我会说,有趣的是,当我尝试使用exec / popen /等时,他的过程现在比我以前运行得更快。
答案 1 :(得分:2)
不是将输出重定向到nul
,而是尝试将所有内容重定向到文件。这应该会告诉你某处是否存在PHP错误:
$outFilePath = "/path/to/file.log";
pclose (popen('start /B cmd /S /C "'.$command.' > ' . $outFilePath . ' 2>' . $outFilePath . ' &"',"r") );
您是否有任何理由使用pclose
/ popen
而非exec
更简单?