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.
您的选择是:
- 将您的 server.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
我需要进行一些音频处理,运行 遇到了同样的问题。
使用反引号 `` 并传递命令。运行与从 shell.
执行时相同
示例:
$command = "rubberband --tempo " . $factor . " " . $input . " " . $output;
`$command`;
我正在通过 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.
您的选择是:
- 将您的 server.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
我需要进行一些音频处理,运行 遇到了同样的问题。
使用反引号 `` 并传递命令。运行与从 shell.
执行时相同示例:
$command = "rubberband --tempo " . $factor . " " . $input . " " . $output;
`$command`;