阐明
针对目前我的项目中须要实时通信的场景,咱们调研了一些第三方的库,目前比拟成熟稳固的为基于workman的gatewaywork比拟适宜。本文次要针对如何集成gatewaywork进行阐明。
装置
首先通过 composer 装置
composer require topthink/think-worker
Nginx配置
location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; }}# websocketslocation =/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
<?phpreturn[ '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
<?phpreturn [ // 扩大本身须要的配置 '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
<?phpreturn [ '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>