在Linux服务器上,我使用shell_exec()
异步运行脚本。这个功能在我用于开发的Windows上不可用,所以我尝试使用popen()
。
我运行的是Windows 10 x64,WampServer 2.5 x32(PHP 5.5.12)。
我在一个PHP文件中有以下代码:
$cmd = '"C:'wamp'bin'php'php5.5.12'php.exe" "C:'wamp'www'path'to'file.php" "arg1" "arg2"';
echo 'Running on DEV MACHINE: ' . $cmd . PHP_EOL;
$handle = popen("start /B " . $cmd, "r");
if ($handle === FALSE) {
die("Unable to execute $cmd");
}
pclose($handle);
脚本执行时没有任何错误,但PHP文件从未运行过。我知道它们没有运行,因为我在最上面放了一个SQL查询来更新数据库中的字段,以指示它们已经运行。
正如您在上面的代码中看到的,我打印出了传递给popen()
的命令。如果我将该命令粘贴到命令提示符中并执行它,则脚本运行良好。这证明问题出在popen()
上。
我是否以某种方式错误地使用了popen()
?如何调试问题所在?通常我会使用XDebug进行调试,但在这种情况下没有办法使用它。
我从来没能让我的代码正常工作,但我在这里找到了另一个答案的替代方法,并在此基础上更改了我的代码,使其使用以下方法,它有效:
$WshShell = new 'COM("WScript.Shell");
$oExec = $WshShell->Run($cmd, 0, false);