workerman Client::publish发布事件没有执行回调函数

tender

代码如下 我是使用的workerman+tp3.2框架 worker类代码如下:
在类构造方法里 实例化一个\Channel\Server服务端 和 WebSocket服务端(在原代码的基础上新增Channel组件,webSocket是可以正常跑起来的,业务在用)
public function __construct(){

    // Channel组件服务端  不传参数默认是监听0.0.0.0:2206
    $channel_server = new Server('0.0.0.0',8865);

    $this->worker = new                                         Worker('websocket://0.0.0.0:8866');// 实例化 Websocket 服务
    $this->worker->count = 10;// 设置进程数
    $this->worker->name ='pusher';
    $this->init();//初始化
    $this->worker->uidConnections = array();
    // 设置回调
    foreach (['onWorkerStart', 'onConnect', 'onMessage', 'onClose', 'onError', 'onBufferFull', 'onBufferDrain', 'onWorkerStop', 'onWorkerReload'] as $event) {
        if (method_exists($this, $event)) {
            $this->worker->$event = [$this, $event];
        }
    }
    // Run worker
    Worker::runAll();
}

在 worker进程 onWorkerStart 事件中注册事件 send_to_uid 代码如下:

/**
 * 每个进程启动
 * @param $worker
 */
public function onWorkerStart($worker)
{
    // Channel客户端连接到Channel服务端
    Client::connect('127.0.0.1', 8865);

    //注册事件
    $a = Client::on('send_to_uid',function ($event_data)use ($worker){

        echo "发布事件";
        echo "\n\r";
        echo "发送数据";
        echo "\n\r";
        var_dump($event_data);
    });
}

最后在onMessage事件中 Client::publish 发布事件:

public function onMessage($connection, $data)
{
    Client::publish('send_to_uid',array('uid'=>11111,'message'=>'1236456'));
    echo "已发布";
}

但是并没有执行注册事件时的回调函数。执行结果如下:
截图

请大佬指教。

2409 2 0
2个回答

six
public function onWorkerStart($worker)
{
    // Channel客户端连接到Channel服务端
    Client::connect('127.0.0.1', 8865);

    //注册事件
    $a = Client::on('send_to_uid',function ($event_data)use ($worker){

        echo "发布事件";
        echo "\n\r";
        echo "发送数据";
        echo "\n\r";
        var_dump($event_data);
    });
}

Client::connect('127.0.0.1', 8865);下一行打印下日志,确认下是否真的运行了监听代码。我觉得有可能onWorkerStart没运行到。

  • 暂无评论
tender

截图
截图

onWorkerStart事件运行了 但是send_to_uid事件的function没有执行。

  • tender 2020-06-02

    已解决。。把channel 服务单拆出去跑一个服务 就可以了 感谢大佬

年代过于久远,无法发表回答
🔝