TP5.1使用 GatewayWorker 进行 socket 通讯

1.安装 Workerman
   composer 安装GatewayWorker内核文件(不包含start_gateway.php start_businessworker.php等启动入口文件)

composer require workerman/gateway-worker

2.创建 Workerman 启动文件
   创建一个自定义命令类文件来启动 Socket 服务端,新建

application/common/command/Workerman.php
<?php
namespace app\common\command;

use app\workerman\Events;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use Workerman\Worker;

class Workerman extends Command
{
    protected function configure()
    {
        $this->setName('workerman')
            ->addArgument('action', Argument::OPTIONAL, "action  start|stop|restart")
            ->addArgument('type', Argument::OPTIONAL, "d -d")
            ->setDescription('workerman chat');
    }
    
    protected function execute(Input $input, Output $output)
    {
        global $argv;
        $action = trim($input->getArgument('action'));
        $type   = trim($input->getArgument('type')) ? '-d' : '';
        
        $argv[0] = 'chat';
        $argv[1] = $action;
        $argv[2] = $type ? '-d' : '';
        $this->start();
    }
    private function start()
    {
        $this->startGateWay();
        $this->startBusinessWorker();
        $this->startRegister();
        Worker::runAll();
    }
    
    private function startBusinessWorker()
    {
        $worker                  = new BusinessWorker();
        $worker->name            = 'BusinessWorker';
        $worker->count           = 1;
        $worker->registerAddress = '127.0.0.1:1236';
        $worker->eventHandler    = Events::class;
    }
    
    private function startGateWay()
    {
        $gateway = new Gateway("websocket://0.0.0.0:8282");
        $gateway->name                 = 'Gateway';
        $gateway->count                = 1;
        $gateway->lanIp                = '127.0.0.1';
        $gateway->startPort            = 2300;
        $gateway->pingInterval         = 30;
        $gateway->pingNotResponseLimit = 0;
        $gateway->pingData             = '{"type":"@heart@"}';
        $gateway->registerAddress      = '127.0.0.1:1236';
    }
    
    private function startRegister()
    {
        new Register('text://0.0.0.0:1236');
    }
}

   配置 application/command.php 文件

return [
    'app\common\command\Workerman',
];

3.创建事件监听文件
   创建 application/workerman/Events.php 文件来监听处理 workerman 的各种事件。

<?php
namespace app\workerman;

use GatewayWorker\Lib\Gateway;

class Events
{
    public static function onWorkerStart($businessWorker){
    }

    public static function onConnect($client_id){
    }

    public static function onWebSocketConnect($client_id, $data){
    }

    public static function onMessage($client_id, $message){
    }

    public static function onClose($client_id){
    }
}

4.启动 Workerman 服务端
   以debug(调试)方式启动

php think workerman start

php think workerman start d   // 以daemon(守护进程)方式启动

php think workerman stop   

php think workerman restart

php think workerman reload

php think workerman status

   当你看到如下结果的时候,workerman已经启动成功了。

Workerman[chat] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.11          PHP version:7.0.29
------------------------ WORKERS -------------------------------
user          worker          listen                    processes status
tegic         Gateway         websocket://0.0.0.0:8282   1         [OK]
tegic         BusinessWorker  none                       1         [OK]
tegic         Register        text://0.0.0.0:1236        1         [OK]
----------------------------------------------------------------
Press Ctrl+C to stop. Start success.

 

### ThinkPHP 5.1 中集成 Workerman 及 Gateway 进行开发 #### 创建项目并安装依赖 为了在 ThinkPHP 5.1 中集成 WorkerMan 和 Gateway,首先需要创建一个新的 ThinkPHP 项目: ```bash composer create-project topthink/think=5.1.x-dev tp5 [^1] ``` 进入项目目录 `tp5` 并通过 Composer 安装 WorkerMan 和 GatewayWorker 扩展包。 ```bash cd tp5 composer require workerman/gateway-worker ``` #### 配置 WorkerMan 启动文件 在项目的根目录下创建一个名为 `start.php` 的启动脚本用于运行 WorkerMan 服务端程序。此文件内容如下所示: ```php <?php // start.php 文件路径位于项目根目录 use GatewayWorker\Lib\Gateway; require_once __DIR__ . '/vendor/autoload.php'; $worker = new \GatewayWorker\BusinessWorker(); $worker->count = 4; // 设置进程数 $worker->name = 'Chat'; // 名字 $worker->registerAddress = '127.0.0.1:1238'; $worker->eventHandler = '\App\WebSocketEventHandler'; // 自定义事件处理器类名空间位置 // 如果不是在根目录启动,则运行runAll方法 if (!defined('GLOBAL_START')) { Worker::runAll(); } ``` 注意这里指定了自定义的 WebSocket 事件处理类 `\App\WebSocketEventHandler` ,该类应该放置于应用命名空间下的适当位置以便加载器能够找到它。 #### 实现 WebSocket 逻辑 接下来,在应用程序内实现具体的业务逻辑。假设已经按照上述配置设置了 `$worker->eventHandler` 属性指向了一个特定的 PHP 类来负责接收来自客户端的消息以及向其发送消息等功能。那么可以在 `app/` 下新建相应的 PHP 文件比如命名为 `WebSocketEventHandler.php` 来编写实际功能代码: ```php <?php namespace App; class WebSocketEventHandler extends \GatewayWorker\GateWay { public static function onConnect($client_id) { echo "new connection from {$client_id}\n"; } /** * 当收到客户端发来的数据时触发 */ public static function onMessage($client_id, $message) { // 发送 hello world 给当前连接上的客户端 self::sendToClient($client_id,'hello world'); // 将 client_id 和 uid 关联起来 \GatewayWorker\Lib\Gateway::bindUid($client_id, uniqid()); } protected static function sendToClient($client_id,$msg){ global $_GW_; $_GW_->gateway->sendToClient($client_id,json_encode(['type'=>'chat','content'=>$msg])); } /** * 当有客户端断开链接的时候触发 */ public static function onClose($client_id) { echo "connection closed\n"; } } ``` 这段代码实现了当新用户加入聊天室(`onConnect`)、接收到消息(`onMessage`)和离开房间(`onClose`)三个主要场景下的行为响应函数,并且包含了简单的绑定 UID 到 Client ID 的操作[^3]。 #### 测试 Websocket 功能 完成以上设置之后就可以尝试重启 WorkerMan 服务器以使更改生效。对于 Windows 用户来说可以执行之前提到过的批处理命令 `start_for_win.bat` 来开启服务[^2];而对于 Linux 或 MacOSX 系统则可以直接利用命令行工具 php 去调用刚才建立好的入口文件 `php start.php start -d` (其中 `-d` 参数表示以后台守护模式运行)。 最后一步就是验证整个系统的正常运作情况了——可以通过浏览器或其他支持 WebSocket 协议的应用模拟作为客户端发起请求并与后端交互从而检验是否成功搭建起了基于 TP5 + WorkerMan/Gateway 构建而成的服务架构体系。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值