阐明

针对目前我的项目中须要实时通信的场景,咱们调研了一些第三方的库,目前比拟成熟稳固的为基于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>