找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 拇指 mztk
查看: 1088|回复: 2

Thinkphp5.1+workerman+getway实现聊天功能,已踩坑

[复制链接]

134

主题

52

回帖

4913

积分

版主

积分
4913
发表于 2023-11-23 15:51:56 | 显示全部楼层 |阅读模式
本帖最后由 win 于 2023-11-24 10:22 编辑

原文地址:https://blog.csdn.net/weixin_44871749/article/details/122325581
我经过踩坑改良的,gatewayclient也放到TP目录下

tp5.1就不多讲了,没有TP5.1基础和composer就别搞了,我只是踩完坑了。
我重要是说服务器端口的事。
只针对windows系统!!!!!!!!!!
TP5.1安装,有得就略过
composer create-project topthink/think=5.1.* tp5


1.去官方下载getway
https://www.workerman.net/doc/gateway-worker/

下载后直接解压到tp5.1里即可,和application同级目录,看图


2.安装gatewayClient,建议使用composer
composer require workerman/gatewayclient

官网地址:http://workerman.net/doc/gateway ... t%E5%AE%89%E8%A3%85
我是用composer安装得,自己安装得位置自己找,我把我安装得截个图。
微信截图_20231123152814.png

3.打开GatewayWorker\Applications\YourApp下的start_gateway.php文件
下面是start_getway.php文件,里面用到了ssl,如果没有证书请直接使用
        $gateway = new Gateway("Websocket://0.0.0.0:9501");
        去掉$gateway->transport = 'ssl';
我有证书
代码如下
<?php
/**
* This file is part of workerman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
$context = array(
    // 更多ssl选项请参考手册 https://php.net/manual/zh/context.ssl.php
'ssl' => array(
        // 请使用绝对路径,我这里是复制apache里的绝对路径,他也报错,但是能连接上。
'local_cert'                 => 'D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl/www.huaheyun.cn.crt',    //.crt
'local_pk'                   => 'D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl/www.huaheyun.cn.key',    //.key
'verify_peer'               => false,
        'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// gateway 进程,这里使用Text协议,可以用telnet测试,这里必须为0.0.0.0
$gateway = new Gateway("Websocket://0.0.0.0:9501",$context);//设置transport开启ssl,websocket+ssl即wss
$gateway->transport = 'ssl';
// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// // gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1236';
//以上内容不要去更改,除了9501和1236端口以外,关于端口,在防火墙里添加入口规则,协议是TCP,9501是外网用,1236是内网用,我用的是华为云,在控制台-安全组里的入口向规则也添加了。
// 心跳间隔
$gateway->pingInterval = 55;

$gateway->pingNotResponseLimit = 1;
// 心跳数据
$gateway->pingData = '{"type":"ping"}';


// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
// $gateway->onConnect = function($connection)
// {
//     $connection->onWebSocketConnect = function($connection , $http_header)
//     {
//         // 可以在这里判断连接来源是否合法,不合法就关掉连接
//         // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
//         if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
//         {
//             $connection->close();
//         }
//         // onWebSocketConnect 里面$_GET $_SERVER是可用的
//         // var_dump($_GET, $_SERVER);
//     };
// };
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}
4.更改Events.php,修改业务逻辑<?php use \GatewayWorker\Lib\Gateway; class Events{    /**     * 每当有客户端连接时,向该客户端发送$client_id,让客户端进行初始化.    */        public static function onConnect($client_id)    {        $resData = [            'type' => 'init',            'client_id' => $client_id,            'msg' => 'connect is success' // 初始化房间信息        ];        Gateway::sendToClient($client_id, json_encode($resData));    }    /**     * 该方法不用添加任何业务处理,所有的业务处理都交给thinkphp5.1的控制器Service里处理!    */    public static function onMessage($client_id,$message){        echo "onMessage:".$client_id.$message."\r\n";    }    /**     * 当客户端断开连接时触发    */    public static function OnClose($client_id){        $msg='{"type":"onclose","client_id":"'.$client_id.'","time":"'.date('Y-m-d H:i:s').'"}';        echo $msg."\r\n";    }}


5.运行start_for_win.bat文件6.autoloda.php文件 vendor.zip (752 Bytes, 下载次数: 228)

7.测试链接

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Websocket 测试</title>
</head>
<body>
<h1>Websocket 测试</h1>
</body>
<script>
    //修改成你的自己的网址
ws = new WebSocket("wss://www.imztk.cc:9501");
    ws.onopen = function() {
        console.log("连接成功");
        ws.send('tom');
        console.log("给服务端发送一个字符串:tom");
    };
    ws.onmessage = function(e) {
        console.log("收到服务端的消息:" + e.data);
    };
    // ws.send('保持连接,发第二次信息,查看服务器回应');
</script>
</html>




回复

使用道具 举报

134

主题

52

回帖

4913

积分

版主

积分
4913
 楼主| 发表于 2023-11-25 22:55:23 | 显示全部楼层
注意:use GatewayClient\Gateway;
require_once '真实路径/vendor/autoload.php';
真实路径‘D:/phpstudy_pro/WWW/www.baidu.cn/GatewayClient/Gateway.php’
回复

使用道具 举报

134

主题

52

回帖

4913

积分

版主

积分
4913
 楼主| 发表于 2023-12-3 12:25:57 | 显示全部楼层
关于版本:
GatewayClient需要3.0.13版本跟3.0.12相同。
PHP的版本大于等于7.0。
Gatewayworker版本需要:V3.1.0。
workerman版本需要:4.0.30。

要不然很多功能不能使用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|再加计算机 ( 鲁ICP备19060125号-10|鲁公网安备37028102001711号 )

GMT+8, 2026-8-13 03:05 , Processed in 0.112217 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表