我花了一些时间试图在Windows上找到一种让PHP脚本异步启动另一个脚本的方法,并且遇到了使用 popen()的建议解决方案。它起初似乎并没有起作用,但是当我加上延迟时,似乎工作得更好一些。但是在进一步的调查中,似乎在主要剧本结束后不久,第二个过程就被杀死了。
这是启动辅助脚本的相关代码位...
$cmd = <<<EOT
start "php" /b "C:\\Program Files (x86)\\iis express\\PHP\\v7.1\\php.exe" -f="$script" $args
EOT;
$p = popen($cmd, 'r');
usleep(500000);
pclose($p);
以及二级脚本的相关部分......
$fp = fopen($argv[1] . '.txt', 'w');
for ($i = 0; $i < 100; $i++) {
fwrite($fp, $i ."\n");
sleep(1);
}
fclose($fp);
这只是概念验证的东西。基本上,第二个脚本打开一个文件,然后以1秒的间隔从0到99写入数字。
问题在于它似乎没有完成。如果睡眠时间为500毫秒,则只能达到约15秒。对于200毫秒,它会达到8左右等等。
我猜这是某种流程所有权问题。例如。当主要脚本终止时,它会终止子进程,但我不确定并且已经没有其他尝试的想法。
(在Windows 10上运行IIS)
有什么建议吗?
答案 0 :(得分:1)
您可以在Windows上运行它:使用COM和WScript.Shell
$WshShell = new COM('WScript.Shell');
$cmd = 'cmd /C php '.$script;
$oExec = $WshShell->Run($cmd, 0, false);
这只适用于Windows,在Linux上你可以运行它。
$cmd = 'php -f '.$script.' > /dev/null &';
exec($cmd, $oExec);
两者都运行非阻塞后台进程。这确实假设您在Windows中将php.exe
的路径添加到环境变量中,否则您可以使用可执行文件的完整路径。
不要问我花了多少时间来解决这个问题,有几个小时。至于popen
,我从来没有这样做过,但是通过管道发送信息或者对我来说不是什么问题。