您的位置 首页 php

thinkphp 6.0 swoole扩展websocket使用教程

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>  

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

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

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

同时,socketio至少在情况下,会认为http://url/是支持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 保留所有权利.// + ----------------------------- ----------------------------------------- // | | </font><font style="vertical-align: inherit;">许可()// + ----------------------------- ----------------------------------------- // | | </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等多个知识点高级进阶干货需要的可以免费分享给大家 ,需要的可以加入 我的官方群。

文章来源:智云一二三科技

文章标题:thinkphp 6.0 swoole扩展websocket使用教程

文章地址:https://www.zhihuclub.com/79065.shtml

关于作者: 智云科技

热门文章

网站地图