阐明
针对目前我的项目中须要实时通信的场景,咱们调研了一些第三方的库,目前比拟成熟稳固的为基于 workman 的 gatewaywork 比拟适宜。本文次要针对如何集成 gatewaywork 进行阐明。
装置
首先通过 composer 装置
composer require topthink/think-worker
Nginx 配置
location / {if (!-e $request_filename){rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
# websockets
location =/websocket{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass https://localhost:21123;
proxy_connect_timeout 86400s;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
SSL 配置
gateway_worker.php
<?php
return[
'protocol' => 'websocket', // 协定 反对 tcp udp unix http websocket text
'host' => '0.0.0.0', // 监听地址
'port' => 21123, // 监听端口
'socket' => '', // 残缺监听地址'ssl'=> true,'transport'=>'ssl','context'=> ['ssl'=> ['local_cert'=>'fullchain.pem', // 证书文件的寄存门路(请改成本人的门路)'local_pk'=>'privkey.pem', // 证书私钥的寄存门路(请改成本人的门路)'verify_peer' => false,]
], // socket 上下文选项
'register_deploy' => true, // 是否须要部署 register
'businessWorker_deploy' => true, // 是否须要部署 businessWorker
'gateway_deploy' => true, // 是否须要部署 gateway
// Register 配置
'registerAddress' => '127.0.0.1:21124',
// Gateway 配置
'name' => 'runnerPaotui',
'count' => 4,
'lanIp' => '127.0.0.1',
'startPort' => 21125,
'daemonize' => true,
'pingInterval' => 30,// 心跳检测, 默认 30 秒, 监测不到断开链接
'pingNotResponseLimit' => 1,// 0 服务端被动发送心跳 (不举荐,默认) 1 客户端定时发送心跳 (举荐,设为 1 后客户端需做被动定时向服务端发包解决)
'pingData' => '{"type":"ping"}',// 服务端定时向客户端发送的数据
// BusinsessWorker 配置
'businessWorker' => [
'name' => 'BusinessWorker',
'count' => 1,
// 'eventHandler' => '\think\worker\Events',
'eventHandler' => '\api\wxapp\controller\Events',
],
];
worker.php
<?php
return [
// 扩大本身须要的配置
'host' => '0.0.0.0', // 监听地址
'port' => 21128, // 监听端口
'root' => '', // WEB 根目录 默认会定位 public 目录'app_path'=>'', // 利用目录 守护过程模式必须设置(绝对路径)'file_monitor' => false, // 是否开启 PHP 文件更改监控(调试模式下主动开启)'file_monitor_interval' => 2, // 文件监控检测时间距离(秒)'file_monitor_path' => [], // 文件监控目录 默认监控 application 和 config 目录
// 反对 workerman 的所有配置参数
'name' => 'thinkphp',
'count' => 4,
'daemonize' => false,
'pidFile' => '',
];
worker_server.php
<?php
return [
'protocol' => 'websocket',
// 'pidFile' => Env::get('runtime_path') . 'worker.pid',
'worker_class' => 'api\wxapp\controller\WorkerController', // 自定义 Workerman 服务类名 反对数组定义多个服务
];
启动
应用 php think worker:gateway 启动 扩大中的 GatewayWorker 即可
php think worker:gateway start #启动
php think worker:gateway stop #进行
php think worker:gateway reload #从新加载
测试脚本
<!DOCTYPE html>
<html>
<head>
<title>HTML5</title>
<meta charset="utf-8" />
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
$(function() {
var socket;
var readyState = ["connecting", "connected", "closing", "closed"];
/* 关上连贯事件 */
$("button:eq(0)").click(function() {
try {
/* 连贯 */
// socket = new WebSocket("ws://*");
socket = new WebSocket("wss://demo.com/websocket");
/* 绑定事件 */
socket.onopen = function() {$("#msg").html("连贯胜利...");
};
socket.onmessage = function(e) {$("#msg").html($("#msg").html() + "<br />" + e.data);
};
socket.onclose = function() {$("#msg").html($("#msg").html() + "<br /> 敞开连贯...");
};
} catch(exception) {$("#msg").html($("#msg").html() + "<br /> 有谬误产生");
}
});
/* 发送数据事件 */
$("button:eq(1)").click(function() {
/* 查看文本框是否为空 */
if($("#data").val() == "") {alert("请输出数据!");
return;
}
try {socket.send($("#data").val());
$("#msg").html($("#msg").html() + "<br /> 发送数据:" + $("#data").val());
} catch (exception) {$("#msg").html($("#msg").html() + "<br /> 发送数据出错");
}
/* 清空文本框 */
$("#data").val("");
});
/* 断开连接 */
$("button:eq(2)").click(function() {socket.close();
});
});
</script>
</head>
<body>
<h1>WebSocket 示例 </h1>
<input type="text" id="data" />
<button> 关上连贯 </button>
<button> 发送数据 </button>
<button> 敞开连贯 </button>
<p id="msg"></p>
</body>
</html>