4

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

4

5 回答 5

3

关闭 sleep 调用中的所有文件描述符以使其分离:

<?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
于 2012-05-16T16:17:57.803 回答
1

PHP 等待被调用的进程终止,即使符号是明确给出的

于 2012-05-16T16:11:13.837 回答
0

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

于 2012-05-16T16:13:43.057 回答
0

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

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

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

于 2012-05-16T16:24:26.407 回答
-1
sleep(30);

桅杆...

<?php
echo "PHP START\n";
echo sleep(30);
echo "PHP END\n";
?>
于 2012-05-16T16:18:34.750 回答