乐趣区

关于thinkphp6:thinkphp6x中如何集成gatewaywork

阐明

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