百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

thinkphp 6.0 swoole扩展websocket使用教程

toyiye 2024-06-21 12:41 11 浏览 0 评论

ThinkPHP即将迎来最新版本6.0,针对目前越来越流行的Swoole,thinkphp也推出了最新的扩展think-swoole 3.0。

介绍

即将推出的tp6.0,已经适应了woole。并推出了think-swoole 3.0,并且已替换了socketio。和2.0版本在使用方法上有些许不同。

Websocket继承与Http,进行websocket连接之前需要一次HTTP请求,如果当期地址支持websocket则返回101,然后进行连接。并不是我的服务支持websocket后,请求每个连接地址都可以进行websocket连接,甚至需要预先适应才可以连接。

参数配置

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">'服务器'=> ['主机'=>'0.0.0.0',//监听地址</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        'port'=> 808,//监听端口</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        'mode'=> SWOOLE_PROCESS,//运行模式默认为SWOOLE_PROCESS</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        'sock_type'=> SWOOLE_SOCK_TCP,//袜子类型默认为SWOOLE_SOCK_TCP</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        'options'=> ['pid_file'=> runtime_path()。</font><font style="vertical-align: inherit;">'swoole.pid','log_file'=> runtime_path()。</font><font style="vertical-align: inherit;">'swoole.log','daemonize'=> false,//通常,此值应根据您的cpu内核大1?4倍。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            'reactor_num'=> swoole_cpu_num(),'worker_num'=> swoole_cpu_num(),'task_worker_num'=> 4,// swoole_cpu_num(),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            'enable_static_handler'=> true,'document_root'=> root_path('public'),'package_max_length'=> 20 * 1024 * 1024,'buffer_output_size'=> 10 * 1024 * 1024,'socket_buffer_size'=> 128 * 1024 * 1024,'max_request'=> 3000,'send_yield'=> true,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        ],</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    ],'websocket'=> ['已启用'=> true,//开启websocket</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        'handler'=> Handler :: class,//自定义wbesocket绑定类</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        'parser'=> Parser :: class,//自定义解析类</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        'route_file'=> base_path()。</font><font style="vertical-align: inherit;">'websocket.php','ping_interval'=> 25000,'ping_timeout'=> 60000,'room'=> [''type'=> TableRoom :: class,'room_rows'=> 4096,'room_size'=> 2048, 'client_rows'=> 8192,'client_size'=> 2048,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        ],</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    ],'auto_reload'=> true,'enable_coroutine'=> true,'resetters'=> [],'tables'=> [],</font></font>

PHP程序员1-7年进阶架构师资料,免费获取


handler和parser大大方便了自定义websocket服务,交替系统集成了socketio。

本文主要介绍如何使用socketio,这里假设大家有socketio有一定了解和使用基础。

socketIo默认会在请求地址后加相应的参数


同时,socketio至少在情况下,会认为http://url/http://socket.io/是支持websocket服务的地址。

而在tp-swoole3.0内部已经该地址请求进行了处理

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><?phpnamespace think \ swoole \ websocket \ socketio;使用think \ Config;使用think \ Cookie;使用think \ Request;类控制器{protected $ transports = ['polling','websocket']; </font><font style="vertical-align: inherit;">公共功能升级(请求$ request,配置$ config,Cookie $ cookie)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    {如果(!in_array($ request-> param('transport'),$ this-> transports)){返回json(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                ['code'=> 0,'message'=>'未知运输,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                ],400</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            );</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        }如果($ request-> has('sid')){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            $ response = response('1:6');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        }其他{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            $ sid = base64_encode(uniqid());</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            $ payload = json_encode(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                ['sid'=> $ sid,'upgrades'=> ['websocket'],'pingInterval'=> $ config-> get('swoole.websocket.ping_interval'),'pingTimeout'=> $ config-> get ('swoole.websocket.ping_timeout'),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                ]</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            );</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            $ cookie-> set('io',$ sid);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            $ response = response('97:0'。$ payload。'2:40');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        }返回$ response-> contentType('text / plain');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    } public function reject(请求$ request)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    {返回json(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            ['code'=> 3,'message'=>'错误请求',</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            ],400</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        );</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font>

TP6.0,插件注册采用了服务方式进行了注册,可在tp-swoole服务注册文件中查看路由注册信息,如果想自定义链接规则,则可以覆盖该路由。

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><?php // + -------------------------------------------- -------------------------- // | </font><font style="vertical-align: inherit;">ThinkPHP [我们可以考虑一下] // + ------------------------------------- --------------------------------- // | | </font><font style="vertical-align: inherit;">版权所有(c)2006-2018 http://thinkphp.cn保留所有权利.// + ----------------------------- ----------------------------------------- // | | </font><font style="vertical-align: inherit;">许可(http://www.apache.org/licenses/LICENSE-2.0)// + ----------------------------- ----------------------------------------- // | | </font><font style="vertical-align: inherit;">作者:yunwuxin <448901948@qq.com> // + ------------------------------------- ---------------------------------命名空间think \ swoole;将Swoole \ Http \ Server用作HttpServer;使用Swoole \ Websocket \ Server作为WebsocketServer;使用think \ App;使用think \ Route;使用think \ swoole \ command \ Server作为ServerCommand;使用think \ swoole \ facade \ Server;使用think \ swoole \ websocket \ socketio \ Controller; </font><font style="vertical-align: inherit;">使用think \ swoole \ websocket \ socketio \ Middleware;类服务扩展\ think \ Service {受保护的$ isWebsocket = false; </font><font style="vertical-align: inherit;">/ **</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

     * @var HttpServer | </font><font style="vertical-align: inherit;">WebsocketServer</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

     * /</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    受保护的静态$ server; </font><font style="vertical-align: inherit;">公共功能寄存器()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    {$ this-> isWebsocket = $ this-> app-> config-> get('swoole.websocket.enabled',false); </font><font style="vertical-align: inherit;">$ this-> app-> bind(Server :: class,function(){if(is_null(static :: $ server)){$ this-> createSwooleServer();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            }返回static :: $ server;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        }); </font><font style="vertical-align: inherit;">$ this-> app-> bind('swoole.server',Server :: class); </font><font style="vertical-align: inherit;">$ this-> app-> bind(Swoole :: class,function(App $ app){返回新的Swoole($ app);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        }); </font><font style="vertical-align: inherit;">$ this-> app-> bind('swoole',Swoole :: class);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    }公共功能启动(Route $ route)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    {$ this-> commands(ServerCommand :: class); </font><font style="vertical-align: inherit;">如果($ this-> isWebsocket){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            $ route-> group(function()use($ route){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                $ route-> get('socket.io/','@upgrade');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                $ route-> post('socket.io/','@reject');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            })->前缀(Controller :: class)->中间件(Middleware :: class);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    } / **</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

     *创建Swoole服务器。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

     * /</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    受保护的函数createSwooleServer()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        $ server = $ this-> isWebsocket吗?</font><font style="vertical-align: inherit;">WebsocketServer :: class:HttpServer :: class;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        $ config = $ this-> app-> config;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        $ host = $ config-> get('swoole.server.host');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        $ port = $ config-> get('swoole.server.port');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        $ socketType = $ config-> get('swoole.server.socket_type',SWOOLE_SOCK_TCP);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        $ mode = $ config-> get('swoole.server.mode',SWOOLE_PROCESS); </font><font style="vertical-align: inherit;">static :: $ server = new $ server($ host,$ port,$ mode,$ socketType);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        $ options = $ config-> get('swoole.server.options'); </font><font style="vertical-align: inherit;">static :: $ server-> set($ options);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font>

套接字使用演示

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><!DOCTYPE html> <html lang =“ zh-CN”> <head></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    <meta charset =“ UTF-8”></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    <title>标题</ title></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    <script src =“ ./ static / js / socket.io.js”> </ script> </ head> <body> <script></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    const socket = io('http:// localhost:808');</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    socket.emit(“ test”,“您的消息”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    socket.on(“ test”,function(res){console.log(res)}); </ script> </ body> </ html></font></font>

Websocket路由配置方法

在app目录下新建websocket.php文件,其中需要注意,由于使用了反射,闭包参数名称不能随意定义,不然无法注入。第一个参数是websocket,是当前websocket的服务器对象,第二个参数data是客户端发送的数据。其中,socketio发出的第一个参数和Websocket :: on的第一个参数一致,作为事件名称。

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><?php / **</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

 *作者:Xavier Yang</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

 *日期:2019/6/5</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

 *电子邮件:499873958@qq.com</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

 * /使用\ think \ swoole \ facade \ Websocket;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

Websocket :: on(“ test”,function(\ think \ swoole \ Websocket $ websocket,$ data){// var_dump($ class);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    $ websocket-> emit(“ test”,“ asd”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

});</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

Websocket :: on(“ test1”,函数($ websocket,$ data){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    $ websocket-> emit(“ test”,“ asd”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

});</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

Websocket :: on(“ join”,function(\ think \ swoole \ Websocket $ websocket,$ data){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    $ websocket-> join(“ 1”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

});</font></font>

tp-swoole3.0同时还有许多其他的新功能,这些功能需要大家去摸索尝试。

我也会在接下来的文章中,一起与大家分享我的使用过程。


以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群。


相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码