exec php需要很长时间

时间:2015-06-30 09:10:33

标签: php ubuntu websocket exec daemon

我正在通过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.

3 个答案:

答案 0 :(得分:2)

进程5558是你的shell。它是生成子进程5559,这是运行PHP脚本的实际进程,即WebSocket服务器。过程5558将继续等待直到子进程完成其执行。 (具体来说,它正在等待子进程与终端分离,或者通过正常终止(包括自己成为守护进程),或者通过成为后台进程并分离其输出。)

您的第一个PHP脚本(具有exec()语句)正在等待 it 创建的进程,以便在返回任何值之前完成执行。由于5558在5559返回之前不会返回,因此您的第一个PHP脚本也不会返回。

您的选择是:

  1. 将您的server.php脚本转换为守护程序。
  2. 在脚本开始之前从终端分离。
  3. 在选项一中,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上侦听,等待客户端连接,它可能永远不会自行退出。