进程间通讯组件channel
v1.0.1
版本
2022-03-08
版本更新时间
1039
安装
3
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发布事件。