进程间通讯组件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 中的enable为false将其关闭。
注意
不管是进程间通讯还是服务器间通讯,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发布事件。