php - exec php 需要很长时间

标签 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.

最佳答案

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

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

您的选择是:

  • 将你的 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 服务器 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/

    相关文章:

    php - 提示的 MySQL 查询

    php - 如何将 red5recorder 与 red5 服务器或 wowza 流服务器一起使用?

    python - 为什么websocket握手失败?

    angular - 有没有办法知道 rxjs websocket 是否打开

    php - 在 WooCommerce 中设置除产品标签之外的最低订单值(value)

    php - 更改下拉菜单宽度

    php - #1449 - phpMyAdmin (指定为定义者的用户 ('***' @'localhost' )不存在)

    ubuntu - 使用 riscV 构建 gem5 时出现构建错误

    c++ - Clang 工具无法在 Ubuntu 16.10 上找到所需的库

    go - WebSocket - 关闭握手 gorilla