因为项目需要用到websocket协议进行服务端主动推送,所以选择引入GatewayWorker
运行环境
配置 | 版本 |
---|---|
PHP | 7.1.18 |
Laravel | 5.6.28 |
操作系统 | Windows Server 2012 R2 |
安装Gatewayworker
下载地址.
下载完成后进行解压,可以看到整个文件夹的目录结构如下所示。
- Events.php BusinessWorker 进程的实际业务处理类
因为在Laravel中完成所有业务逻辑,GatewayWorker仅仅当做一个单向的推送通道,所以我将Events.php修改如下:
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id, json_encode(array(
'type' => 'init',
'client_id' => $client_id
)));
}
/**
* 当客户端发来消息时触发
* @param int $client_id 连接id
* @param mixed $message 具体消息
*/
public static function onMessage($client_id, $message)
{
// 向所有人发送
}
/**
* 当用户断开连接时触发
* @param int $client_id 连接id
*/
public static function onClose($client_id)
{
// 向所有人发送
}
- start_businessworker.php BusinessWorker 进程的启动文件
// bussinessWorker 进程
$worker = new BusinessWorker();
// worker名称
$worker->name = 'YourAppBusinessWorker';
// bussinessWorker进程数量
$worker->count = 4;
// 服务注册地址
$worker->registerAddress = '127.0.0.1:1238';
- start_gateway.php Gateway 进程的启动文件
// gateway 进程
$gateway = new Gateway("websocket://0.0.0.0:8282");
// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';
- tart_register.php Register 服务进程的启动文件
// register 必须是text协议
$register = new Register('text://0.0.0.0:1238');
- start_for_win.bat Windows 环境下 GatewayWorker 所有 Worker 进程的启动文件
- start.php Linux 环境下 GatewayWorker 所有 Worker 进程的启动文件
运行star_for_win.bat,可以看到如下画面
安装GatewayClient拓展
在Laravel根目录下运行以下命令
composer require workerman/gatewayclient
安装完成后,在需要调用GatewayClient接口的控制器里引用命名空间
use GatewayClient\Gateway;
并设置 Gateway::$registerAddress 属性,告知 GatewayClient 与哪个 GatewayWorker (集群)通讯
Gateway::$registerAddress = '127.0.0.1:1238';
现在,就可以在Laravel中调用GatewayClient接口实现各种功能了。