我正在通过php文件执行一个守护程序文件,如:
echo exec("php -q /var/www/project/server.php");
但是它需要很长时间,并且还注意到它创建了两个相同的过程,如:
5558 ? S 0:00 sh -c php -q /var/www/project/server.php
5559 ? S 0:00 php -q /var/www/project/server.php
那么请帮助我为什么要创建两个流程?
如何加快执行速度?
我使用的是php 5.5,ubuntu
更新
我使用Ratchet作为websocket 这是server.php的代码
<?php
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
$server = IoServer::factory(
new WsServer(
new DraftAuction()
)
, 8181
);
$server->run(); // If I comment this line getting response faster but I cant do that, this line keeps process in continues running mode.
答案 0 :(得分:2)
进程5558是你的shell。它是生成子进程5559,这是运行PHP脚本的实际进程,即WebSocket服务器。过程5558将继续等待直到子进程完成其执行。 (具体来说,它正在等待子进程与终端分离,或者通过正常终止(包括自己成为守护进程),或者通过成为后台进程并分离其输出。)
您的第一个PHP脚本(具有exec()
语句)正在等待 it 创建的进程,以便在返回任何值之前完成执行。由于5558在5559返回之前不会返回,因此您的第一个PHP脚本也不会返回。
您的选择是:
在选项一中,fork,kill parent,关闭STDOUT和STDERR,再次fork,kill parent。不,我不会进入更多的细节,因为要做到这一点,在一本很好的厚厚的参考书中真的需要一章完整的Posix过程。
在选项二中,更改exec()
语句,如下所示:
exec("php -q /var/www/project/server.php >/dev/null 2>&1 &");
这会将您的输出重定向到/dev/null
(无处),并将进程置于后台状态。 echo
没有意义,因为没有任何内容可以打印出来。
然后你的shell就可以退出了(没有什么可以让它等待),然后你的原始脚本就可以成功完成,新的WebSocket服务器运行无头。
并且,我想快速指出:这不是一个WebSocket问题,也不是一个编程问题。这是一个Unix / Linux问题,问题的根源在SuperUser上得到了更彻底的回答:https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely
答案 1 :(得分:1)
我需要完成一些音频处理,然后遇到了同样的问题。
使用反斜线``并传递命令。与从shell执行时的运行方式相同。
示例:
$command = "rubberband --tempo " . $factor . " " . $input . " " . $output;
`$command`;
答案 2 :(得分:0)
作为一个疯狂的猜测,$server->run();
甚至应该回归?看起来它在端口8181上侦听,等待客户端连接,它可能永远不会自行退出。