2017-08-09 173 views
0

我花了一些时间尝试在Windows上找到一种方式,让PHP脚本异步启动另一个脚本,并遇到了使用popen()的建议解决方案。起初它似乎没有工作,但是当我加入延迟时似乎工作得更好一些。但经过进一步调查,似乎在主要脚本结束后不久,二级进程就被杀死了。当主脚本停止时,异步PHP脚本停止

下面是启动二级脚本代码的相关位...

$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); 

这只是证明OF-概念的东西。基本上,第二个脚本打开一个文件,然后以1秒为间隔写入0到99之间的数字。

问题是它似乎没有完成。如果睡眠时间为500ms,则只能达到大约15.对于200ms,它会达到大约8,等等。

我猜测这是某种流程所有权问题。例如。当主脚本终止时,会终止子进程,但我不确定,并且已经没有什么可尝试的想法了。

(在Windows 10运行IIS)

有什么建议?

回答

1

你可以像这样的窗口中运行它:使用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好吧,我从来没有得到过这个工作,但是通过管道发送信息或者不是我所关心的。

+0

太棒了!我设法让它只用“php”工作,但实际上并不是我现在想运行的版本,而使用完整路径似乎消失了。有任何想法吗? – xtempore

+0

不是PHP的版本?,请检查你的环境变量(路径)中分配了什么php.exe。就我个人而言,我运行Apache 7和Apache 5.5,所以当我单元测试时,我可以测试它对该版本lol – ArtisticPhoenix

+0

如果你不知道如何改变它,你可以参考这个https:// john-dugan。 com/add-php-windows-path-variable/ – ArtisticPhoenix