進(jìn)程間通訊組件channel

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