ThinkPHP5 跟 GatewayWorker 的结合

摘要

初次接触 GatewayWorker1 是接手一个共享设备的项目,当时时间紧,只顾着完成任务,所以都没好好看文档。
后来在另一个项目中刚好查到有跟 TP5.1 文章2,以之前接触学到的皮毛,成功的实践运用了起来。
直到最近才有时间好好整理学习 GatewayWorker 以及 Workerman 的一些知识。
下面所述就是有关一些总结和感受。


环境

lnmp 的开发环境,PHP 框架使用着 TP5.0


背景介绍

项目基于小程序来实现业务需求,采用前后端分离、后端以 API 的形式处理交互逻辑。
开发过程中,涉及到场景如 会员卡支付外卖配送状态的更新 等,需要在用户停留的页面实时更新数据。
在已经知道有 GatewayWorker 这么好用的框架的情况下,果断选择采用。具体原因参考知乎的高赞回帖3,也是使用该框架前需要具备的基本知识吧。


需求

用户打开某个页面并且停留,如支付的付款页,需要实时返回给前端支付后处理逻辑的结果。所以在这个页面就相当于跟前端发起了私聊
虽然 GatewayWorker 也支持群聊,但是这些场景都用不到。


开发过程

由于是在现有的项目中引入长连接,所以就不说 TP5.0 的安装了,可以查看 官方手册。

1. 安装所需要的拓展

(1) 安装 topthink/think-worker4

> composer require topthink/think-worker=1.0.*

需要注意的是版本问题。目前我们的框架是 5.0 版本的,所以需要加上 =1.0.* 。
具体支持版本,可以跳转查看 github 上的 readme 说明。
参考这文章2里的配置安装的,在我们项目中暂未发现有用到此扩展的地方。。

(2) 安装 workerman/gateway-worker5

> composer require workerman/gateway-worker

(3) 安装 workerman/gatewayclient

> composer require workerman/gatewayclient

工具类的拓展。

2. 服务端实现

服务端的实现可参考上文提到的这篇文章「thinkphp5 + GatewayWorker + Workerman」的服务器实现代码。

3. 处理业务的类 Events

由于我们的场景比较简单,只需要通知前端「需要刷新页面」的信号即可。所以,处理的业务只有几行代码:

use \GatewayWorker\Lib\Gateway;

class GatewayEvents
{
     
    /**
     * 当客户端连接时触发
     * 当有客户端连接时,将client_id返回,让mvc框架判断当前uid并执行绑定
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
     
        Gateway::sendToClient($client_id, json_encode(array(
            'type' => 'initialize',
            'client_id' => $client_id
        )));
    }
}

4. 绑定 client_id 与用户的 uid

GatewayClient\Gateway::bindUid($client_id, $uid);

5. 给某 uid 的用户发送消息

GatewayClient\Gateway::sendToUid($uid, json_encode($message));

前端收到消息后,即可做出相关处理。
实现的场景就是能够实时更新该页面的状态,而无需用户多余的操作。


总结需要注意的地方

  • 创建wss服务
    强烈建议看看 workerman文档 - 创建wss服务的章节

除了用Workerman自身的SSL,也可以利用nginx/apache作为wss代理转发给workerman(注意此方法workerman部分千万不要设置ssl,否则将无法连接)。

  • 查看运行状态
    workerman 文档 - 查看运行状态

运行 php start.php status 可以查看到WorkerMan的运行状态

在开始尝试之前如果对上述有所了解,大概是能顺利一点的。


  1. GatewayWorker2.x 3.x 手册 ↩︎

  2. thinkphp5 + GatewayWorker + Workerman ↩︎ ↩︎

  3. WebSocket 是什么原理?为什么可以实现持久连接?——知乎 ↩︎

  4. ThinkPHP 官方团队开发的 think-worker 拓展 ↩︎

  5. 只安装 GatewayWorker 内核文件(不包含 start_gateway.php start_businessworker.php 等启动入口文件) ↩︎

你可能感兴趣的:(总结归纳,ThinkPHP,GatewayWorker,Workerman)