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