sudo php gateway.php start 启动后无响应

leesaijyun

启动时无响应,

root@lsy-PC:/home/wwwroot/wecharge-server# sudo php gateway.php start

/home/wwwroot/wecharge-server/thinkphp/library/think/Debug.php:193:
array(3) {
  [0] =>
  string(39) "\app\gateway\controller\EventsWebsocket"
  [1] =>
  string(36) "\app\gateway\controller\EventsHuaxia"
  [2] =>
  string(36) "\app\gateway\controller\EventsGuoyao"
}

Workerman[gateway.php] start in DEBUG mode
------------------------------------------------- WORKERMAN -------------------------------------------------
Workerman version:4.0.6          PHP version:7.3.11
-------------------------------------------------- WORKERS --------------------------------------------------
proto   user            worker                     listen                      processes    status           
tcp     root            Register                   text://0.0.0.0:1239         1             [OK]            
tcp     root            websocketBusinessWorker    none                        1             [OK]            
tcp     root            websocket                  websocket://0.0.0.0:8001    4             [OK]            
tcp     root            Register                   text://0.0.0.0:1238         1             [OK]            
tcp     root            huaxiaBusinessWorker       none                        1             [OK]            
tcp     root            huaxia                     huaxia://0.0.0.0:8989       4             [OK]            
tcp     root            Register                   text://0.0.0.0:1240         1             [OK]            
tcp     root            GuoyaoBusinessWorker       none                        1             [OK]            
tcp     root            Guoyao                     guoyao://0.0.0.0:8990       4             [OK]            
-------------------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
^[[A^CWorkerman[gateway.php] stopping ...
*****  app\gateway\controller\EventsWebsocket     onWorkerStart *****
^[[Aworker[websocket:8540] exit with status 9
worker[websocket:8542] exit with status 9
worker[websocket:8543] exit with status 9
worker[huaxiaBusinessWorker:8545] exit with status 9
worker[huaxia:8547] exit with status 9
worker[websocketBusinessWorker:8539] exit with status 9
worker[Guoyao:8553] exit with status 9
worker[huaxia:8549] exit with status 9
worker[Guoyao:8552] exit with status 9
worker[GuoyaoBusinessWorker:8551] exit with status 9
worker[Register:8550] exit with status 9
worker[Guoyao:8554] exit with status 9
worker[Guoyao:8555] exit with status 9
worker[huaxia:8546] exit with status 9
worker[huaxia:8548] exit with status 9
worker[Register:8538] exit with status 9
Workerman[gateway.php] has been stopped

php gateway.php status 查询状态就会卡住
我workerman只启动了自定义通讯协议和websocket , 但是一启动服务 , 混着把我的nginx的http服务也卡住
以上问题只会在本地linux开发时出现 ,代码thinkphp5整合到一起 ,在Centos的服务器不会出现 , 应该是环境配置问题
本地环境linux 安装的LNMP
服务器CentOS 也是安装的LNMP

<?php
namespace app\gateway\controller;

use Workerman\Worker;
use GatewayWorker\Register;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;

class Run
{
    public function __construct() {
        $this->hardware();
        $this->websocket();

        // 运行所有Worker;
        Worker::runAll();
    }

    public function hardware() {
        // 初始化register
        new Register('text://0.0.0.0:1238');

        //初始化 bussinessWorker 进程
        $worker = new BusinessWorker();
        $worker->name = 'BusinessWorker';
        $worker->count = 1;
        $worker->registerAddress = '127.0.0.1:1238';

        // 设置处理业务的类,此处制定Events的命名空间
        $worker->eventHandler = '\app\gateway\controller\EventsDevice';
        // 初始化 gateway 进程

        // 证书最好是申请的证书
        $context = array(
            // 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
            'ssl' => array(
                // 请使用绝对路径
                'local_cert' => APP_PATH . '/common/cert/3893683_.pem', // 也可以是crt文件
                'local_pk' => APP_PATH . '/common/cert/3893683_.key',
                'verify_peer' => false,
                // 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
            )
        );

        $gateway = new Gateway("Communication://0.0.0.0:8989", $context);
//        $gateway->transport = 'ssl';

        $gateway->protocol = '\\app\\gateway\\protocols\\Communication';

        $gateway->name = 'huaxia pile';
        $gateway->count = 4;
        $gateway->lanIp = '127.0.0.1';
        $gateway->startPort = 2900;
        $gateway->registerAddress = '127.0.0.1:1238';

        //心跳时间
        $gateway->pingInterval = 60;         //每次心跳时间
        $gateway->pingNotResponseLimit = 5; //无响应心跳次数限制
//        $gateway->pingData = '{"action": "system/ping"}';//响应心跳数据(不建议)
    }

    //websocket 的 gateway 服务
    public function websocket() {
        // 初始化register
        new Register('text://0.0.0.0:1239');

        //初始化 bussinessWorker 进程
        $worker = new BusinessWorker();
        $worker->name = 'webBusinessWorker';
        $worker->registerAddress = '127.0.0.1:1239';

        // 设置处理业务的类,此处制定Events的命名空间
        $worker->eventHandler = '\app\gateway\controller\EventsWebsocket';

        $context = array(
            // 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
            'ssl' => array(
                // 请使用绝对路径
                'local_cert' => APP_PATH . '/common/cert/3893683.pem', // 也可以是crt文件
                'local_pk' => APP_PATH . '/common/cert/3893683.key',
                'verify_peer' => false,
                // 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
            )
        );

        $websocket = new Gateway("websocket://0.0.0.0:8001", $context);
        $websocket->transport = 'ssl';

        $websocket->name = 'websocket';
        $websocket->count = 4;
        $websocket->lanIp = '127.0.0.1';
        $websocket->startPort = 3000;
        $websocket->registerAddress = '127.0.0.1:1239';

    }
}
阅读 865
2个回答

leesaijyun

源码修改部分

//修复一个workermanBUG(无法解析自定义通讯协议文件)
//  ./vendor/workerman/workerman/Worker.php  的 parseSocketAddress()
把
    $this->protocol = \substr($scheme, 0, 1) === '\\' ? $scheme : '\\Protocols\\' . $scheme;
改成
    if(empty($this->protocol)) {
        $this->protocol = \substr($scheme, 0, 1) === '\\' ? $scheme : '\\Protocols\\' . $scheme;
    }
  • 暂无评论
walkor

http://doc.workerman.net/debug/busy-process.html
根据文档调试下看下进程卡在哪个系统调用上

  • leesaijyun 2020-10-20

    因为php gateway.php status无响应 ,只能用workerman.log启动日志的pid

    root@lsy-PC:/home/wwwroot/wecharge-server# strace -ttp 28323
    strace: Process 28323 attached
    09:53:06.674526 wait4(-1, 
  • walkor 2020-10-20

    这个是主进程,看他没有用。用 ps auxf 查看子进程pid,strace子进程pid

  • leesaijyun 2020-10-20

    一步步排查下来 , 找到了问题 , 是Xdebug调试导致的无响应
    谢谢