为什么 PHP 挂起,当 bash 调用分叉时


why is PHP hanging, when a bash call forks

我正在从php调用一些bash代码,但即使我分叉了bash(用&),php也不会在完整的bash完成之前完成。

此代码:

<html>
<body>
HTML START<br>
<pre>
<?php
echo "PHP START'n";
echo `sleep 30 &`;
echo "PHP END'n";
?>
</pre>
HTML END<br>
</body>
</html>

在 30 秒之前不会在浏览器中显示任何内容。

我真正想要的是从一个 php 启动一个 GUI 应用程序,它应该继续运行。

关闭睡眠调用中的所有文件描述符以允许其分离:

<?php
echo "PHP START'n";
echo `sleep 30 <&- 1<&- 2<&- &`;
echo "PHP END'n";
?>

否则,输出文件描述符仍然打开,PHP 仍在尝试等待接收其输出,即使进程不再直接附加也是如此。

这在运行时正常工作,立即退出,但留下睡眠进程:

$ time php5 test.php; ps auxw | grep sleep | grep -v grep
PHP START
PHP END
real    0m0.019s
user    0m0.008s
sys         0m0.004s
cduffy    6239  0.0  0.0  11240   576 pts/0    S    11:23   0:00 sleep 30

PHP 等待被调用的进程终止,即使 amp; 符号是显式给定

也许通过使用对另一个 PHP 脚本的 Ajax 调用来创建另一个 HTTP 进程,该任务是在服务器上异步启动您的 sleep 30 命令或任何您想要的内容。

您可能想做的是分离分叉的进程。一种方法是在 bash 命令中使用nohup

例如,查看用户对 php.net>exec的评论,尤其是这个:http://www.php.net/manual/en/function.exec.php#88704

但是要小心,您会失去直接反馈,并且必须通过其他方式监控您的过程/结果

sleep(30);

桅杆是...

<?php
echo "PHP START'n";
echo sleep(30);
echo "PHP END'n";
?>