Server->sendMessage

此函数可以向任意Worker进程或者Task进程发送消息。在非主进程和管理进程中可调用。收到消息的进程会触发onPipeMessage事件。

bool Server->sendMessage(mixed $message, int $dst_worker_id);

参数

  • $message为发送的消息数据内容,没有长度限制,但超过8K时会启动内存临时文件
  • $dst_worker_id为目标进程的ID,范围是0 ~ (worker_num + task_worker_num - 1)
  • Task进程内调用sendMessage是阻塞等待的,发送消息完成后返回
  • Worker进程内调用sendMessage是异步的,消息会先存到发送队列,可写时向管道发送此消息
  • User进程内调用sendMessage底层会自动判断当前的进程是异步还是同步选择不同的发送方式

返回值

发送成功返回true,失败返回false

sendMessage接口在1.7.9以上版本可用
MacOS/FreeBSD下超过2K就会使用临时文件存储

注意事项

  • 使用sendMessage必须注册onPipeMessage事件回调函数
  • 设置了task_ipc_mode = 3将无法使用sendMessage向特定的task进程发送消息

实例

$serv = new Swoole\Server("0.0.0.0", 9501);
$serv->set(array(
    'worker_num' => 2,
    'task_worker_num' => 2,
));
$serv->on('pipeMessage', function($serv, $src_worker_id, $data) {
    echo "#{$serv->worker_id} message from #$src_worker_id: $data\n";
});
$serv->on('task', function ($serv, $task_id, $reactor_id, $data){
    var_dump($task_id, $from_id, $data);
});
$serv->on('finish', function ($serv, $fd, $reactor_id){

});
$serv->on('receive', function (swoole_server $serv, $fd, $reactor_id, $data) {
    if (trim($data) == 'task')
    {
        $serv->task("async task coming");
    }
    else
    {
        $worker_id = 1 - $serv->worker_id;
        $serv->sendMessage("hello task process", $worker_id);
    }
});

$serv->start();

  • 丰灵

    测试了下 好像onPipeMessage监听不了,发送都可以发送成功,但是触发不了onPipeMessage事件

  • 覃祺华

    1.8.13增加Server->sendMessage自动串化功能,现在sendMessage可以将任意PHP变量发到其他工作进程, 这个意思是可发送资源型或者类结构吗?

  • 小剑

    使用过程中发现在 定时器 after 中使用 sendMessage 会直接导致worker异常退出,怎么解决呢? 是否不能这么用?

  • 小剑

    抱歉,刚刚是我弄错了,回调函数中我多加了参数,导致了异常

  • Smˋ﹎ 哟、

    pipeMessage里面可以调用task方法吗

  • 奔赴

        $worker_id = 1 - $serv->worker_id;
    

    实例应该是消息发给自己 $worker_id = $serv->worker_id - 1;

  • 奔赴

    看错 路过

  • 傲雪孤魂

    $worker_id = 1 - $serv->worker_id;
    // 这里应该是 $worker_id = 3 - $serv->worker_id; 吧
    

  • 傲雪孤魂

    $serv->set(array(
        'worker_num' => 2,
        'task_worker_num' => 2,
    ));
    

    worker_id 0, 1 是 worker 进程
    worker_id 2, 3 是 task 进程