exec php 需要很长时间

exec php takes long time

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

作为一个大胆的猜测,$server->run(); 甚至应该 return 吗?貌似监听8181端口,等待客户端连接,估计永远不会自己退出了。

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

您的第一个 PHP 脚本,它有 exec() 语句,正在等待 创建的进程在它之前完成执行 returns 任何值。因为 5558 不会 return 直到 5559 returns,你的第一个 PHP 脚本也不会 return.

您的选择是:

  1. 将您的 server.php 脚本变成守护进程。
  2. 甚至在脚本开始之前就与终端分离。

在选项一中,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

我需要进行一些音频处理,运行 遇到了同样的问题。

使用反引号 `` 并传递命令。运行与从 shell.

执行时相同

示例:

$command = "rubberband --tempo "  . $factor . " " . $input . " " . $output;
`$command`;