摘要
初次接触 GatewayWorker
1 是接手一个共享设备的项目,当时时间紧,只顾着完成任务,所以都没好好看文档。
后来在另一个项目中刚好查到有跟 TP5.1
文章2,以之前接触学到的皮毛,成功的实践运用了起来。
直到最近才有时间好好整理学习 GatewayWorker
以及 Workerman
的一些知识。
下面所述就是有关一些总结和感受。
环境
lnmp
的开发环境,PHP 框架使用着 TP5.0
。
背景介绍
项目基于小程序来实现业务需求,采用前后端分离、后端以 API
的形式处理交互逻辑。
开发过程中,涉及到场景如 会员卡支付 、外卖配送状态的更新 等,需要在用户停留的页面实时更新数据。
在已经知道有 GatewayWorker
这么好用的框架的情况下,果断选择采用。具体原因参考知乎的高赞回帖3,也是使用该框架前需要具备的基本知识吧。
需求
用户打开某个页面并且停留,如支付的付款页,需要实时返回给前端支付后处理逻辑的结果。所以在这个页面就相当于跟前端发起了私聊。
虽然 GatewayWorker
也支持群聊,但是这些场景都用不到。
开发过程
由于是在现有的项目中引入长连接,所以就不说 TP5.0
的安装了,可以查看 官方手册。
1. 安装所需要的拓展
(1) 安装 topthink/think-worker
4
> composer require topthink/think-worker=1.0.*
需要注意的是版本问题。目前我们的框架是 5.0
版本的,所以需要加上 =1.0.* 。
具体支持版本,可以跳转查看 github
上的 readme
说明。
参考这文章2里的配置安装的,在我们项目中暂未发现有用到此扩展的地方。。
(2) 安装 workerman/gateway-worker
5
> 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的运行状态
在开始尝试之前如果对上述有所了解,大概是能顺利一点的。