后端开发:当GatewayWorker遇到ThinkPHP 5.0.11

最近在做毕业设计,两个项目都遇到了使用websocket的需求,但不想与TP5分开。看了TP5的官方文档,有Workerman的组件,但是没得GatewayWorker的使用方法。这里总结一下!!

步骤

  • 安装TP5
    不管你是如何安装TP5的,只要最后你能打开浏览器看到TP5的欢迎界面。

  • 安装GatewayWorker
    方式有很多,推荐使用composer来安装GatewayWorker
    如果你的composer可以正常运行,请到你项目的根目录执行:
    composer require workerman/gateway-worker
    就可以安装成功了。你可以在vendor目录下看到workerman目录。

  • 建立入口文件
    一般入口文件都是建立在public目录的,这里的GatewayWorker入口文件也一样。
    public目录建立一个server.php文件,这个文件名字随意取。
    文件里内容如下:

#!/usr/bin/env php
<?php

define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','push/Run');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

我相信你认真看是能懂的。
与一般的TP5入口文件一样,只是在第5行配置了一个控制器绑定:绑定到了push模块的Run控制器。

  • 建立Run控制器
    使用TP5自带的命令行工具可以帮助你快速生成一个控制器:

    php think make:controller push/Run

    执行了上述指令,会在application目录下建立一个push/controller/Run.php文件。我们需要在此文件下做一些处理。

<?php

namespace app\push\controller;

use Workerman\Worker;
use GatewayWorker\Register;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;

class Run
{
    public function __construct()
    {

        // 初始化register
        new Register('text://0.0.0.0:1238');

        //初始化 bussinessWorker 进程
        $worker = new BusinessWorker();
        $worker->name = 'RoomBusinessWorker';
        $worker->count = 4;
        $worker->registerAddress = '127.0.0.1:1238';

        // 设置处理业务的类,此处制定Events的命名空间
        $worker->eventHandler = '\app\push\controller\Events';
        // 初始化 gateway 进程
        $gateway = new Gateway("websocket://0.0.0.0:8282");
        $gateway->name = 'RoomGateway';
        $gateway->count = 4;
        $gateway->lanIp = '127.0.0.1';
        $gateway->startPort = 2900;
        $gateway->registerAddress = '127.0.0.1:1238';

        // 运行所有Worker;
        Worker::runAll();
    }
}

与一般的gateway使用没有任何区别,如果你不懂,请看官网文档。

  • 建立Events.php文件

    在上述代码中66行设置了事件类,我们需要去实现它。
    继续使用TP5的命令行工具去建立文件:
    php think make:controller push/Events
    内如如下:

<?php

namespace app\push\controller;

use GatewayWorker\Lib\Gateway;

class Events
{
    /**
     * 有消息时
     * @param integer $client_id 连接的客户端
     * @param mixed $message
     * @return void
     */
    public static function onMessage($client_id, $message)
    {
        // debug
        echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']}  client_id:$client_id session:".json_encode($_SESSION)." onMessage:".$message."\n";
    }

    /**
     * 当用户连接时触发的方法
     * @param integer $client_id 连接的客户端
     * @return void
     */
    public static function onConnect($client_id)
    {
        Gateway::sendToClient($client_id, "Your client_id is $client_id");
    }

    /**
     * 当用户断开连接时触发的方法
     * @param integer $client_id 断开连接的客户端
     * @return void
     */
    public static function onClose($client_id)
    {
        Gateway::sendToAll("client[$client_id] logout\n");
    }

    /**
     * 当进程启动时
     * @param integer $businessWorker 进程实例
     */
    public static function onWorkerStart($businessWorker)
    {
        echo "WorkerStart\n";
    }

    /**
     * 当进程关闭时
     * @param integer $businessWorker 进程实例
     */
    public static function onWorkerStop($businessWorker)
    {
        echo "WorkerStop\n";
    }
}

在此类型中可以使用TP5一些工具,比如模型!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,399评论 19 139
  • Welcome 目前网络上充斥着大量的陈旧信息,让PHP新手误入歧途,传播着错误的实践和糟糕的代码,这必须得到纠正...
    layjoy阅读 21,827评论 7 118
  • 因为最近有个项目涉及到Socket通信,于是自己尝试了一下搭建一个服务端WebSocket通信的项目,写个笔记,能...
    JonsonHamilton阅读 38,222评论 11 20
  • 昨天有报道说,一美少女又因看美景忘乎所以,搭上了正处花季的生命。据说在广东佛山南海狮山莲塘村的200亩玫瑰花田,被...
    补拙莫如勤LV阅读 460评论 0 1
  • 今天的晨读介绍的是《习惯的力量》这本书,提出了习惯回路的概念,其中介绍了用改变习惯回路中的惯常行为来改变坏习惯的方...
    齐漾阅读 240评论 0 3

友情链接更多精彩内容