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

时间:2012-05-16 16:07:24

标签: php bash fork

我从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应用程序,它应该继续运行。

5 个答案:

答案 0 :(得分:3)

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

<?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

答案 1 :(得分:1)

即使明确给出了&amp;和

,PHP也会等待被叫进程终止

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

例如查看php.net上的用户评论&gt; exec,特别是这一个:http://www.php.net/manual/en/function.exec.php#88704

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

答案 4 :(得分:-1)

sleep(30);

桅杆......

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