主脚本停止时,异步PHP脚本停止

时间:2017-08-09 05:01:14

标签: php windows asynchronous process

我花了一些时间试图在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)

有什么建议吗?

1 个答案:

答案 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,我从来没有这样做过,但是通过管道发送信息或者对我来说不是什么问题。