企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Server->sendMessage [TOC] 此函数可以向任意`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(); ~~~