進程間通訊組件channel

v2.1.0
版本
2025-02-07
版本更新時間
1405
安裝
2
star
簡介
webman/channel 是一個進程間通訊組件,用于進程間通訊及服務器之間通訊。接口采用訂閱模式。訂閱者訂閱某些事件,發(fā)布者發(fā)布對應事件,實現(xiàn)進程間及服務器間通訊。
安裝
composer require webman/channel
使用
安裝后會自動啟動名為plugin.webman.channel.server
的channel服務端,如果你是多服務器通訊,當前服務器不需要channel服務端時,更改 config/plugin/webman/channel/app.php
中的enable
為false
將其關閉。
注意
不管是進程間通訊還是服務器間通訊,plugin.webman.channel.server
只能啟動一個,所有需要通訊的channel客戶端(包括訂閱者和發(fā)布者)必須連接同一個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);
// 要訂閱的事件名稱(名稱可以為任意的數(shù)字和字符串組合)
$event_name = 'event_xxxx';
// 訂閱某個自定義事件并注冊回調(diào),收到事件后會自動觸發(fā)此回調(diào)
Client::on($event_name, function($event_data) {
var_dump($event_data);
});
// 每秒發(fā)布一次事件
Timer::add(1, function () {
// 要發(fā)布的事件名稱
$event_name = 'event_xxxx';
// 事件數(shù)據(jù)(數(shù)據(jù)格式可以為數(shù)字、字符串、數(shù)組),會傳遞給客戶端回調(diào)函數(shù)作為參數(shù)
$event_data = array('some data.', 'some data..');
// 發(fā)布某個自定義事件,訂閱這個事件的客戶端會收到事件數(shù)據(jù),并觸發(fā)客戶端對應的事件回調(diào)
Client::publish($event_name, $event_data);
});
}
}
修改 config/process.php
添加以下配置
return [
// 這里省略了其它配置...
'channe_client' => [
'handler' => \process\ChannelClient::class
]
];
restart重啟終端將會打印訂閱到的數(shù)據(jù)
訂閱方式一:在每個webman進程中訂閱
創(chuàng)建 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);
// 要訂閱的事件名稱(名稱可以為任意的數(shù)字和字符串組合)
$event_name = 'event_xxxx';
// 訂閱某個自定義事件并注冊回調(diào),收到事件后會自動觸發(fā)此回調(diào)
Client::on($event_name, function($event_data) {
var_dump($event_data);
});
}
}
配置config/bootstrap.php
return [
// 這里省略了其它配置...
app\bootstrap\Channel::class,
];
restart 重啟后,進程名為webman的進程將會執(zhí)行訂閱事件。
發(fā)布事件
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';
// 事件數(shù)據(jù)(數(shù)據(jù)格式可以為數(shù)字、字符串、數(shù)組),會傳遞給客戶端回調(diào)函數(shù)作為參數(shù)
$event_data = array('some data from controller', 'some data..');
// 發(fā)布某個自定義事件,訂閱這個事件的客戶端會收到事件數(shù)據(jù),并觸發(fā)客戶端對應的事件回調(diào)
Client::publish($event_name, $event_data);
return 'ok';
}
}
提示
Webman\Channel\Client
可以作為發(fā)布者在php-fpm環(huán)境中使用(php-fpm環(huán)境不支持訂閱),也就是說你可以在傳統(tǒng)項目中(Laraval ThinkPHP等)使用Webman\Channel\Client
給webman發(fā)布事件。