我正在通过 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.
最佳答案
进程 5558 是你的外壳。它在那里生成子进程 5559,它是运行 PHP 脚本的实际进程,即您的 WebSocket 服务器。进程 5558 将继续等待,直到子进程完成其执行。 (具体来说,它正在等待子进程与终端分离,或者通过正常终止(包括自己成为守护进程),或者通过成为后台进程并分离其输出。)
您的第一个 PHP 脚本,它有 exec()
语句,在返回任何值之前等待它创建的进程完成执行。由于在 5559 返回之前 5558 不会返回,因此您的第一个 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 服务器 headless 运行。
而且,我想快速指出:这真的不是 WebSocket 问题,也不是编程问题。这是一个 Unix/Linux 问题,问题的根源在 SuperUser 上得到了更彻底的回答:https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely
关于php - exec php 需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31134076/