thinkphp6 使用GatewayWorker

发布于 2021-01-07  23 次阅读


官方手册

https://www.kancloud.cn/walkor/gateway-worker/642185

前言

GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等

在TP6中安装

1.首先通过composer安装

composer require topthink/think-worker

2.think-worker默认是安装了workman和GatewayWorker了,在vendor/workman目录下

编辑配置文件

在config/gateway_worker.php目录下新建文件

<?php
return [
    // 扩展自身需要的配置
    'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text
    'host' => '0.0.0.0', // 监听地址
    'port' => 2348, // 监听端口
    'socket' => '', // 完整监听地址
    'context' => [], // socket 上下文选项
    'register_deploy' => true, // 是否需要部署register
    'businessWorker_deploy' => true, // 是否需要部署businessWorker
    'gateway_deploy' => true, // 是否需要部署gateway

    // Register配置
    'registerAddress' => '127.0.0.1:1236',

    // Gateway配置
    'name' => 'thinkphp',
    'count' => 1,
    'lanIp' => '127.0.0.1',
    'startPort' => 2000,
    'daemonize' => false,
    'pingInterval' => 30, //30秒不发心跳断开连接
    'pingNotResponseLimit' => 1, //服务端不允许客户端不发送心跳
    'pingData' => '{"type":"ping"}',//服务端定时向客户端发送的数据

    // BusinsessWorker配置
    'businessWorker' => [
        'name' => 'BusinessWorker',
        'count' => 1,
        'eventHandler' => '\think\worker\Events',
    ],

];

websocket前端示例代码

<!DOCTYPE html>  
<html>  
<head>  
<title>HTML5</title>  
<meta charset="utf-8" />  
<body>
</body>
<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://39.96.9.241:6789");  
             socket = new WebSocket("ws://192.168.30.128:2348");
             /* 绑定事件 */  
             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>

后端在tp框架中运行gateway服务

php think worker:gateway

在框架中使用gateway

详见:https://www.kancloud.cn/walkor/gateway-worker/326107

执行顺序(GateWay)

  1. onConnect 建立连接
  2. onWebSocketConnect 握手操作
  3. onMessage 收到用户数据

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。