进程间通讯组件channel

v1.0.1 版本
2022-03-08 版本更新时间
824 安装
3 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发布事件。