我正在从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";
?>