【备忘】thinkphp5.1之websocket长连接框架使用流程简述

这篇具有很好参考价值的文章主要介绍了【备忘】thinkphp5.1之websocket长连接框架使用流程简述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文纯属经验备注,有许多地方未进行测试,请勿照搬,仅供参考。

之前专门花了几天时间测试了websocket,当时只记得踩了许多坑,但是没有对测试流程进行记录,导致长时间未使用从而无从下手。

今天就简单记录一下使用流程。

环境介绍

  • php7.4+
  • linux
  • nginx
  • thinkphp5.1
  • workerman

流程

1、安装长连接框架:composer require workerman/gateway-worker
2、配置基本参数
     配置文件为 config/gateway_worker.php(必须使用对应命令才能启动)
         配置端口startPort,pingData,eventHandler,其它默认就好
     eventHandler配置为app\index\logic\events\Events.php类,用于处理监听后的业务逻辑
3、启动服务
     唯一启动命令:php think worker:gateway
4、nginx服务配置以支持/wss方式访问
     参考配置:
     location /wss
     {
         proxy_pass http://127.0.0.1:2000;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "Upgrade";
         proxy_set_header X-Real-IP $remote_addr;
     }
5、JavaScript客户端建立连接并访问
     ws = new WebSocket("wss://bootest.playtest.top/wss");//这种访问方式需要nginx配置
     ws.onopen = function() {
         alert("连接成功");
         ws.send('hello,thinkphp');
         alert("给服务端发送一个字符串:hello,thinkphp");

详细配置参考(gateway_worker.php)

//gateway_worker.php 文件配置
<?php  
// +----------------------------------------------------------------------
// | Workerman设置 仅对 php think worker:gateway 指令有效
// +----------------------------------------------------------------------
return [
    /** 【长连接使用此配置,启动命令: php think worker:gateway  】 */
    // 扩展自身需要的配置
    'protocol'              => 'websocket', // 协议 支持 tcp udp unix http websocket text
    'host'                  => '0.0.0.0', // 监听地址
    'port'                  => 2000, // 监听端口
    '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'             => 1350,
    'daemonize'             => false,
    'pingInterval'          => 30,
    'pingNotResponseLimit'  => 0,
    //这里根据自己需要配置,不一定使用json
    'pingData'              => '{"code":"200","msg":"ok","action":"ping"}',

    // BusinsessWorker配置
    'businessWorker'        => [
        'name'         => 'BusinessWorker',
        'count'        => 1,
//        'eventHandler' => '\think\worker\Events',
        //这里配置事件监听后的业务逻辑处理代码,Events.php类
        'eventHandler' => 'app\index\logic\events\Events',
    ],


];

Events类(定制业务逻辑)

上面eventHandler类对应的文件

<?php

namespace app\index\logic\events;

use app\index\logic\Baselogic;
use GatewayWorker\Lib\Gateway;
use think\worker\Application;
use wanghua\general_utility_tools_php\tool\Tools;
use Workerman\Worker;

/**
 * 事件监听后的业务逻辑(自由定制)
 */
class Events extends \think\worker\Events
{

    /**
     * onWorkerStart 事件回调
     * 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
     *
     * @access public
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStart(Worker $businessWorker)
    {
        $app = new Application;
        $app->initialize();
    }

    /**
     * onConnect 事件回调
     * 当客户端连接上gateway进程时(TCP三次握手完毕时)触发
     *
     * @access public
     * @param  int       $client_id
     * @return void
     */
    public static function onConnect($client_id)
    {
        //一个连接只触发一次
        Tools::log_to_write_text('客户端完成TCP握手');
        $res = Tools::set_ok('ok','onConnect',['client_id'=>$client_id]);
        Gateway::sendToCurrentClient(json_encode($res,JSON_UNESCAPED_UNICODE));
    }

    /**
     * onWebSocketConnect 事件回调
     * 当客户端连接上gateway完成websocket握手时触发
     *
     * @param  integer  $client_id 断开连接的客户端client_id
     * @param  mixed    $data {
    "get":[

    ],
    "server":{
    "REQUEST_METHOD":"GET",
    "REQUEST_URI":"/wss",
    "SERVER_PROTOCOL":"HTTP/1.1",
    "HTTP_UPGRADE":"websocket",
    "HTTP_CONNECTION":"Upgrade",
    "HTTP_X_REAL_IP":"183.227.89.107",
    "HTTP_HOST":"127.0.0.1:2000",
    "SERVER_NAME":"127.0.0.1",
    "SERVER_PORT":"2000",
    "HTTP_PRAGMA":"no-cache",
    "HTTP_CACHE_CONTROL":"no-cache",
    "HTTP_USER_AGENT":"wechatdevtools desktopapp appservice port/62717 token/589065e467011760c777411fca2cd0aa runtime/2 MicroMessenger",
    "HTTP_ORIGIN":"https://boomim.playone.cn",
    "HTTP_SEC_WEBSOCKET_VERSION":"13",
    "HTTP_ACCEPT_ENCODING":"gzip, deflate, br",
    "HTTP_ACCEPT_LANGUAGE":"zh-CN,zh;q=0.9",
    "HTTP_CONTENT_TYPE":"application/json",
    "HTTP_REFERER":"https://servicewechat.com/wx55e10fb2834803d5/devtools/page-frame.html",
    "HTTP_SEC_WEBSOCKET_KEY":"uWOWC1AZahJOpS18hN3ZHA==",
    "HTTP_SEC_WEBSOCKET_EXTENSIONS":"permessage-deflate; client_max_window_bits",
    "QUERY_STRING":""
    },
    "cookie":[

    ]
    }
     * @return void
     */
    public static function onWebSocketConnect($client_id, $data)
    {

//        var_export($data);
        //对应客户端打开连接, 一个连接只触发一次
        Tools::log_to_write_text(['客户端打开了websocket连接',$data]);
        //$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'客户端打开连接时,发送到服务端的消息:','data'=>$data]);
        //
        //Gateway::sendToCurrentClient(json_encode($res,JSON_UNESCAPED_UNICODE));
    }

    /**
     * onMessage 事件回调
     * 当客户端发来数据(Gateway进程收到数据)后触发
     *
     * @access public
     * @param  int       $client_id
     * @param  mixed     $data
     * @return void
     */
    public static function onMessage($client_id, $data)
    {
        Tools::log_to_write_text(['客户端发来数据(Gateway进程收到数据).client_id:'.$client_id,$data]);
        //$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'你发来的消息我接收到了:',$client_id=>$data]);
        //Gateway::sendToClient($client_id,json_encode($res,JSON_UNESCAPED_UNICODE));


    }

    /**
     * onClose 事件回调 当用户断开连接时触发的方法
     *
     * @param  integer $client_id 断开连接的客户端client_id
     * @return void
     */
    public static function onClose($client_id)
    {
        //GateWay::sendToAll("client[$client_id] logout\n");
        Tools::log_to_write_text(['断开连接.client_id:'.$client_id]);
    }

    /**
     * onWorkerStop 事件回调
     * 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
     *
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStop(Worker $businessWorker)
    {
        //echo "WorkerStop\n";
        Tools::log_to_write_text(['businessWorker进程退出时触发。每个进程生命周期内都只会触发一次.',$businessWorker]);
    }
}

END文章来源地址https://www.toymoban.com/news/detail-817392.html

到了这里,关于【备忘】thinkphp5.1之websocket长连接框架使用流程简述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Docker Dockerfile构建php LNMP集成开发环境,并运行Thinkphp5

    系统:MAC、Windows10 Docker版本:Docker version 23.0.5 Docker Desktop:Dockerdesktop官方地址 这篇主要介绍如何在Mac、Windows10使用docker搭建LNMP集成开发环境。下面我会写Dockerfile编译安装Nginx+php基础环境。mysql、redis基于官方Docker hub,分别构建我们自己的镜像。  code目录存放工程代码,会映

    2024年02月15日
    浏览(59)
  • thinkphp6和thinkphp5有什么区别

    Thinkphp6.0完全开发手册 采用PHP7强类型(严格模式) tp5 环境要求PHP = 5.4.0 ThinkPHP6.0的环境要求 PHP = 7.2.5 6.0版本开始,必须通过Composer方式安装和更新,所以你无法通过Git下载安装。 支持更多的PSR规范 V6.0.10版本开始 支持 psr7 response 多应用支持 tp5默认使用多应用模式部署 tp6 安

    2024年02月06日
    浏览(58)
  • thinkphp5拦截验证token

    写一个BaseController 类 基本思路: 1、继承一个公共基类,将验证相关代码放在基类 2、根据 孩子类下的notNeedToken 来决定是否进行验证 3、验证失败后,直接响应回来 这里需要封装一个主要代码: 如果直接return 返回,是不会终止执行的,而是会继续执行到指定的控制器,所以

    2024年02月15日
    浏览(45)
  • thinkPhp5返回某些指定字段

    或者指定要的字段的数组  查询符合条件的多条数据  

    2024年02月09日
    浏览(46)
  • ThinkPHP5远程命令执行漏洞

    ThinkPHP是一个快速、兼容而且简单的轻量级国产 PHP开发框架 ,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,使用面向对象的开发结构和 MVC模式 ,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式。 由于th

    2024年02月11日
    浏览(48)
  • Thinkphp5.x全漏洞复现分析

    我们可以把namespace理解为一个单独的空间,事实上它也就是一个空间而已,子命名空间那就是空间里再划分几个小空间,举个例子: 当有多个子命名空间有相同名称类时,不指定使用哪个命名空间的情况下取最后定义的命名空间中的类,比如上面的 dog 取的时 dogC 中的类,在

    2024年04月22日
    浏览(46)
  • ThinkPHP5系列远程代码执行漏洞复现(详细)

    ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于框架对控制器名没有进行足够的检测,会导致在没有开启强制路由的情况下可执行任意方法,从而导致远程命令执行漏洞。 漏洞危害 启动环境 切换到/thinkphp/5.0.23-rce# 目录下 将version改为2,保存并退出 接着执行 此时环境

    2024年02月12日
    浏览(44)
  • ThinkPHP5.0.23 远程代码执行漏洞

    ThinkPHP 是一款运用极广的 PHP 开发框架。其 5.0.23 以前的版本中,获取 method 的方法中没有正确处理方法名,导致攻击者可以调用 Request 类任意方法并构造利用链,从而导致远程代码执行漏洞。 百度漏洞 获得exp 路径: POST传参 我用的是hackbar,用burpsuite也行。 burp操作方法 抓包

    2024年02月11日
    浏览(46)
  • ThinkPHP5.0.21远程命令执行漏洞

    漏洞出现的背景 : ThinkPHP是⼀款运⽤极⼴的PHP开发框架。 其5.0.23以前的版本中,获取method的⽅法中没有正确处理⽅法名, 导致攻击者可以调⽤Request类任意⽅法并构造利⽤链,从⽽导致远程代码执⾏漏洞。 由于ThinkPHP5框架对控制器名没有进⾏⾜够的安全检测,导致在没有开

    2024年02月04日
    浏览(47)
  • 知识笔记(九十)———ThinkPHP5中时间查询的方法

    使用 where 方法 where 方法支持时间比较,例如: 第三个参数可以传入任何有效的时间表达式,会自动识别你的时间字段类型,支持的时间类型包括 timestamps 、 datetime 、 date 和 int 。 使用 whereTime 方法 whereTime 方法提供了日期和时间字段的快捷查询,示例如下: 还提供了更方便

    2024年01月21日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包