进程间通讯组件channel

v2.1.0 版本
2025-02-07 版本更新时间
4743 安装
4 star

简介

webman/channel 是一个进程间通讯组件,用于进程间通讯及服务器之间通讯。接口采用订阅模式。订阅者订阅某些事件,发布者发布对应事件,实现进程间及服务器间通讯。

安装

composer require webman/channel

使用

安装后会自动启动名为plugin.webman.channel.server的channel服务端,如果你是多服务器通讯,当前服务器不需要channel服务端时,更改 config/plugin/webman/channel/app.php 中的enablefalse将其关闭。

注意
不管是进程间通讯还是服务器间通讯,plugin.webman.channel.server只能启动一个,所有需要通讯的channel客户端(包括订阅者和发布者)必须连接同一个channel server。

订阅方式一:独立启动一个进程作为订阅者

新建process/ChannelClient.php

<?php namespace process; use Workerman\Timer; use Webman\Channel\Client; class ChannelClient { public function __construct() { Client::connect('127.0.0.1', 2206); // 要订阅的事件名称(名称可以为任意的数字和字符串组合) $event_name = 'event_xxxx'; // 订阅某个自定义事件并注册回调,收到事件后会自动触发此回调 Client::on($event_name, function($event_data) { var_dump($event_data); }); // 每秒发布一次事件 Timer::add(1, function () { // 要发布的事件名称 $event_name = 'event_xxxx'; // 事件数据(数据格式可以为数字、字符串、数组),会传递给客户端回调函数作为参数 $event_data = array('some data.', 'some data..'); // 发布某个自定义事件,订阅这个事件的客户端会收到事件数据,并触发客户端对应的事件回调 Client::publish($event_name, $event_data); }); } }

修改 config/process.php

添加以下配置

return [ // 这里省略了其它配置... 'channe_client' => [ 'handler' => \process\ChannelClient::class ] ];

restart重启终端将会打印订阅到的数据

订阅方式一:在每个webman进程中订阅

创建 app/bootstrap/Channel.php

<?php namespace app\bootstrap; use Webman\Bootstrap; use Webman\Channel\Client; use Workerman\Timer; class Channel implements Bootstrap { public static function start($worker) { // 只给webman进程设置订阅 if (!$worker || $worker->name !== 'webman') return; Client::connect('127.0.0.1', 2206); // 要订阅的事件名称(名称可以为任意的数字和字符串组合) $event_name = 'event_xxxx'; // 订阅某个自定义事件并注册回调,收到事件后会自动触发此回调 Client::on($event_name, function($event_data) { var_dump($event_data); }); } }

配置config/bootstrap.php

return [ // 这里省略了其它配置... app\bootstrap\Channel::class, ];

restart 重启后,进程名为webman的进程将会执行订阅事件。

发布事件

app/controller/Index.php

<?php namespace app\controller; use support\Request; use Webman\Channel\Client; class Index { public function index(Request $request) { Client::connect('127.0.0.1', 2206); $event_name = 'event_xxxx'; // 事件数据(数据格式可以为数字、字符串、数组),会传递给客户端回调函数作为参数 $event_data = array('some data from controller', 'some data..'); // 发布某个自定义事件,订阅这个事件的客户端会收到事件数据,并触发客户端对应的事件回调 Client::publish($event_name, $event_data); return 'ok'; } } 

提示
Webman\Channel\Client 可以作为发布者在php-fpm环境中使用(php-fpm环境不支持订阅),也就是说你可以在传统项目中(Laraval ThinkPHP等)使用Webman\Channel\Client给webman发布事件。

赞助商