GatewayWorker

安装:

composer require workerman/gateway-worker

目录结构:

0x01 Gateway类

注意:startPort设置端口,是和BusinessWorker进行连接的本地端口。

GatewayWorker类的使用

创建项目目录,然后composer下载gateway,然后在项目根目录下创建

gateway.php

<?php
require_once 'vendor/autoload.php';

use Workerman\Worker;
use GatewayWorker\Gateway;
$gate = new Gateway('text://0.0.0.0:8880');
$gate->name = 'gateway';
$gate->count = 4;
$gate->onWorkerStart = function(){
    echo 'gate way start'.PHP_EOL;
};
$gate->onWorkerStop = function(){
    echo 'gate way stop'.PHP_EOL;
};

Worker::runAll();c

0x02 BusinessWorker

gateway和business必须在register中注册后, gateway才能向business发送数据

只有gateway能想business发送数据的时候,客户端才能连接gateway

<?php
/*
 * @Author: your name
 * @Date: 2020-09-11 22:34:56
 * @LastEditTime: 2020-09-11 22:55:54
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /www/business_worker.php
 */
require_once 'vendor/autoload.php';

use Workerman\Worker;
use GatewayWorker\BusinessWorker;
$business = new BusinessWorker();
$business->name='business';
$business->count = 2;
$business->registerAddress = '127.0.0.1:6666';
// $business->eventHandler ='Events'; //Events.php
$business->onWorkerStart = function(){
    echo "business start".PHP_EOL;
};
$business->onWorkerStop = function(){
    echo "business stop".PHP_EOL;
};
Worker::runAll();

0x03 Register类

<?php
/*
 * @Author: your name
 * @Date: 2020-09-11 22:34:56
 * @LastEditTime: 2020-09-11 22:58:08
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /www/business_worker.php
 */
require_once 'vendor/autoload.php';

use Workerman\Worker;
use GatewayWorker\Register;

$register = new Register('text://127.0.0.1:6666');
Worker::runAll();

注意:gateway 和 business中注册的地址 必须 和 register类中的地址相同

gateway 是唯一暴露给客户端的接口,客户端要想连接gateway,必须保证

gateway,business,register三个进程都启动

当客户端发数据给gateway的时候,gateway将数据转发给business

business最终将数据转发给Events,events的onMessage 函数接收数据。

0x04 Events

\

当Events被修改之后,至少要重启business.php ,否则修改不生效。

<?php
/*
 * @Author: your name
 * @Date: 2020-09-12 08:43:28
 * @LastEditTime: 2020-09-12 09:04:43
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /www/Events.php
 */
class Events{
    public static function onWorkerStart($business){
        echo 'Events worker start';
    }
    public static function onConnect($client_id){
        echo 'client_id...'.$client_id.PHP_EOL;
    }
    public static function onMessage($client_id,$message){
        echo 'events on Message';
        echo $client_id.'====='.$message.PHP_EOL;
    }
    public static function  onClose($client_id){
        echo 'client_id...'.$client_id.'on close'.PHP_EOL;
    }
    public static function onWorkerStop(){
        echo 'worker stop'.PHP_EOL;
    }
    public static function onWebSocketConnect($client_id,$data){
        var_dump($data);
    }
}

0x05 Lib\Gateway

<?php
/*
 * @Author: your name
 * @Date: 2020-09-12 08:43:28
 * @LastEditTime: 2020-09-12 10:43:35
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /www/Events.php
 */

use GatewayWorker\Lib\Gateway;

class Events
{
    public static function onWorkerStart($business)
    {
        echo 'Events worker start';
    }
    public static function onConnect($client_id)
    {
        echo 'client_id...' . $client_id . PHP_EOL;
        Gateway::sendToClient($client_id, '连接成功!');
    }
    public static function onMessage($client_id, $message)
    {
        echo 'events on Message';
        echo $client_id . '=====' . $message . PHP_EOL;
        Gateway::sendToAll('@全体成员,这是一条群发!');
        Gateway::sendToUid(88, 'hello uid:88');
        Gateway::joinGroup($client_id,8888);
        switch ($message) {
            case 'close':
                Gateway::closeClient($client_id, "连接关闭成功");
                Gateway::bindUid($client_id, 88);
                break;
            case 'getAllClientIdList':
                $list = Gateway::getAllClientIdList();
                var_dump($list);
                break;
                //获取当前在线连接总数
            case 'getAllClientIdCount':
                echo 'getAllClientIdCount:' . Gateway::getAllClientIdCount();
                break;
            case 'isOnline':
                echo Gateway::isOnline($client_id);
                break;
            case 'getClientIdByUid':
                $message = json_encode(Gateway::getClientIdByUid(88));
                Gateway::sendToClient($client_id, $message);
                break;
            case 'getUidByClientId':
                $message= 'your uid is:'.Gateway::getUidByClientId($client_id);
                Gateway::sendToClient($client_id,$message);
                break;
            case 'getAllUidList':
                $message = json_encode(Gateway::getAllUidList());
                Gateway::sendToClient($client_id,$message);
                break;
            case 'sendToGroup':
                $message = '群聊';
                Gateway::sendToGroup(8888,$message);
                break;
            case 'setSession':
                Gateway::setSession($client_id,['username'=>'xiaoming','userid'=>123]);
                Gateway::sendToClient($client_id,'设置成功');
                break; 
            case 'getSession':
                $message = Gateway::getSession($client_id);
                Gateway::sendToClient($client_id,$message);
                break;  

        }
    }
    public static function  onClose($client_id)
    {
        echo 'client_id...' . $client_id . 'on close' . PHP_EOL;
    }
    public static function onWorkerStop()
    {
        echo 'worker stop' . PHP_EOL;
    }
    public static function onWebSocketConnect($client_id, $data)
    {
        var_dump($data);
    }
}

0x06 配置SSL

0x07 心跳

gate.php

require_once 'vendor/autoload.php';

// use Workerman\Worker;
use GatewayWorker\Gateway;
$gate = new Gateway('text://0.0.0.0:8880');
$gate->name = 'gateway';
$gate->count = 4;
$gate->registerAddress = '127.0.0.1:6666';
$gate->pingInterval = 10;
$gate->pingNotResponseLimit = 2;
$gate->pingData = 'ping';

$gate->onWorkerStart = function(){
    echo 'gate way start'.PHP_EOL;
};
$gate->onWorkerStop = function(){
    echo 'gate way stop'.PHP_EOL;
};

0x08 TP5.1整合gatewayWorker

下载tp5.1框架

下载workerman 和gatewayWorker :composer require topthink/think-worker

启动gateway worker:php think worker:gateway  ,自动同时启动gateway,business_worker,register

在config 的gateway_worker.php中可以配置gateway,business_worker,register

gateway的配置:

用户唯一需要关心的只是真正干活的Events,这个命名空间可以修改成我们需要的命名空间,然后我们自己实现Events.php即可

<?php
/*
 * @Author: your name
 * @Date: 2020-09-12 15:53:58
 * @LastEditTime: 2020-09-12 15:55:37
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /thinkphp5.1/application/gateway/Events.php
 */
namespace app\gateway;

class Events {
    public static function onMessage($client_id,$message){
        echo 'client_id='.$client_id.' message:'.$message;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值