热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

thinkphp6.0swoole扩展websocket使用教程(life)

ThinkPHP即将迎来最新版本6.0,针对目前越来越流行的Swoole,thinkphp也推出了最新的扩展think-swoole3.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连接,甚至需要预先适应才可以连接。

参数配置

'服务器'=> ['主机'=>'0.0.0.0',//监听地址'port'=> 808,//监听端口'mode'=> SWOOLE_PROCESS,//运行模式默认为SWOOLE_PROCESS'sock_type'=> SWOOLE_SOCK_TCP,//袜子类型默认为SWOOLE_SOCK_TCP'options'=> ['pid_file'=> runtime_path()。'swoole.pid','log_file'=> runtime_path()。'swoole.log','daemonize'=> false,//通常,此值应根据您的cpu内核大1〜4倍。'reactor_num'=> swoole_cpu_num(),'worker_num'=> swoole_cpu_num(),'task_worker_num'=> 4,// swoole_cpu_num(),'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,],],'websocket'=> ['已启用'=> true,//开启websocket'handler'=> Handler :: class,//自定义wbesocket绑定类'parser'=> Parser :: class,//自定义解析类'route_file'=> base_path()。'websocket.php','ping_interval'=> 25000,'ping_timeout'=> 60000,'room'=> [''type'=> TableRoom :: class,'room_rows'=> 4096,'room_size'=> 2048, 'client_rows'=> 8192,'client_size'=> 2048,],],'auto_reload'=> true,'enable_coroutine'=> true,'resetters'=> [],'tables'=> [],

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

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

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

 

【社群福利】30G-PHP进阶资料,助力大家都能30K

 

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

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

<&#xff1f;phpnamespace think \ swoole \ websocket \ socketio;使用think \ Config;使用think \ COOKIE;使用think \ Request;类控制器{protected $ transports &#61; [&#39;polling&#39;&#xff0c;&#39;websocket&#39;]; 公共功能升级&#xff08;请求$ request&#xff0c;配置$ config&#xff0c;COOKIE $ COOKIE&#xff09;{如果&#xff08;&#xff01;in_array&#xff08;$ request-> param&#xff08;&#39;transport&#39;&#xff09;&#xff0c;$ this-> transports&#xff09;&#xff09;{返回json&#xff08;[&#39;code&#39;&#61;> 0&#xff0c;&#39;message&#39;&#61;>&#39;未知运输&#xff0c;]&#xff0c;400&#xff09;;}如果&#xff08;$ request-> has&#xff08;&#39;sid&#39;&#xff09;&#xff09;{$ response &#61; response&#xff08;&#39;1&#xff1a;6&#39;&#xff09;;}其他{$ sid &#61; base64_encode&#xff08;uniqid&#xff08;&#xff09;&#xff09;;$ payload &#61; json_encode&#xff08;[&#39;sid&#39;&#61;> $ sid&#xff0c;&#39;upgrades&#39;&#61;> [&#39;websocket&#39;]&#xff0c;&#39;pingInterval&#39;&#61;> $ config-> get&#xff08;&#39;swoole.websocket.ping_interval&#39;&#xff09;&#xff0c;&#39;pingTimeout&#39;&#61;> $ config-> get &#xff08;&#39;swoole.websocket.ping_timeout&#39;&#xff09;&#xff0c;]&#xff09;;$ COOKIE-> set&#xff08;&#39;io&#39;&#xff0c;$ sid&#xff09;;$ response &#61; response&#xff08;&#39;97&#xff1a;0&#39;。$ payload。&#39;2:40&#39;&#xff09;;}返回$ response-> contentType&#xff08;&#39;text / plain&#39;&#xff09;;} public function reject&#xff08;请求$ request&#xff09;{返回json&#xff08;[&#39;code&#39;&#61;> 3&#xff0c;&#39;message&#39;&#61;>&#39;错误请求&#39;&#xff0c;]&#xff0c;400&#xff09;;}}

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

<&#xff1f;php // &#43; -------------------------------------------- -------------------------- // | ThinkPHP [我们可以考虑一下] // &#43; ------------------------------------- --------------------------------- // | | 版权所有&#xff08;c&#xff09;2006-2018 http://thinkphp.cn保留所有权利.// &#43; ----------------------------- ----------------------------------------- // | | 许可&#xff08;http://www.apache.org/licenses/LICENSE-2.0&#xff09;// &#43; ----------------------------- ----------------------------------------- // | | 作者&#xff1a;yunwuxin <448901948&#64;qq.com> // &#43; ------------------------------------- ---------------------------------命名空间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; 使用think \ swoole \ websocket \ socketio \ Middleware;类服务扩展\ think \ Service {受保护的$ isWebsocket &#61; false; / *** &#64;var HttpServer | WebsocketServer* /受保护的静态$ server; 公共功能寄存器&#xff08;&#xff09;{$ this-> isWebsocket &#61; $ this-> app-> config-> get&#xff08;&#39;swoole.websocket.enabled&#39;&#xff0c;false&#xff09;; $ this-> app-> bind&#xff08;Server :: class&#xff0c;function&#xff08;&#xff09;{if&#xff08;is_null&#xff08;static :: $ server&#xff09;&#xff09;{$ this-> createSwooleServer&#xff08;&#xff09;;}返回static :: $ server;}&#xff09;; $ this-> app-> bind&#xff08;&#39;swoole.server&#39;&#xff0c;Server :: class&#xff09;; $ this-> app-> bind&#xff08;Swoole :: class&#xff0c;function&#xff08;App $ app&#xff09;{返回新的Swoole&#xff08;$ app&#xff09;;}&#xff09;; $ this-> app-> bind&#xff08;&#39;swoole&#39;&#xff0c;Swoole :: class&#xff09;;}公共功能启动&#xff08;Route $ route&#xff09;{$ this-> commands&#xff08;ServerCommand :: class&#xff09;; 如果&#xff08;$ this-> isWebsocket&#xff09;{$ route-> group&#xff08;function&#xff08;&#xff09;use&#xff08;$ route&#xff09;{$ route-> get&#xff08;&#39;socket.io/&#39;&#xff0c;&#39;&#64;upgrade&#39;&#xff09;;$ route-> post&#xff08;&#39;socket.io/&#39;&#xff0c;&#39;&#64;reject&#39;&#xff09;;}&#xff09;->前缀&#xff08;Controller :: class&#xff09;->中间件&#xff08;Middleware :: class&#xff09;;}} / ***创建Swoole服务器。* /受保护的函数createSwooleServer&#xff08;&#xff09;{$ server &#61; $ this-> isWebsocket吗&#xff1f;WebsocketServer :: class&#xff1a;HttpServer :: class;$ config &#61; $ this-> app-> config;$ host &#61; $ config-> get&#xff08;&#39;swoole.server.host&#39;&#xff09;;$ port &#61; $ config-> get&#xff08;&#39;swoole.server.port&#39;&#xff09;;$ socketType &#61; $ config-> get&#xff08;&#39;swoole.server.socket_type&#39;&#xff0c;SWOOLE_SOCK_TCP&#xff09;;$ mode &#61; $ config-> get&#xff08;&#39;swoole.server.mode&#39;&#xff0c;SWOOLE_PROCESS&#xff09;; static :: $ server &#61; new $ server&#xff08;$ host&#xff0c;$ port&#xff0c;$ mode&#xff0c;$ socketType&#xff09;;$ options &#61; $ config-> get&#xff08;&#39;swoole.server.options&#39;&#xff09;; static :: $ server-> set&#xff08;$ options&#xff09;;}}

套接字使用演示

<&#xff01;DOCTYPE html> 标题 const socket &#61; io&#xff08;&#39;http&#xff1a;// localhost&#xff1a;808&#39;&#xff09;;socket.emit&#xff08;“ test”&#xff0c;“您的消息”&#xff09;;socket.on&#xff08;“ test”&#xff0c;function&#xff08;res&#xff09;{console.log&#xff08;res&#xff09;}&#xff09;;

Websocket路由配置方法

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

<&#xff1f;php / ***作者&#xff1a;Xavier Yang*日期&#xff1a;2019/6/5*电子邮件&#xff1a;499873958&#64;qq.com* /使用\ think \ swoole \ facade \ Websocket;Websocket :: on&#xff08;“ test”&#xff0c;function&#xff08;\ think \ swoole \ Websocket $ websocket&#xff0c;$ data&#xff09;{// var_dump&#xff08;$ class&#xff09;;$ websocket-> emit&#xff08;“ test”&#xff0c;“ asd”&#xff09;;}&#xff09;;Websocket :: on&#xff08;“ test1”&#xff0c;函数&#xff08;$ websocket&#xff0c;$ data&#xff09;{$ websocket-> emit&#xff08;“ test”&#xff0c;“ asd”&#xff09;;}&#xff09;;Websocket :: on&#xff08;“ join”&#xff0c;function&#xff08;\ think \ swoole \ Websocket $ websocket&#xff0c;$ data&#xff09;{$ websocket-> join&#xff08;“ 1”&#xff09;;}&#xff09;;

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

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

 

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


推荐阅读
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文详细介绍了在 React Native 开发过程中遇到的 'Could not connect to development server' 错误及其解决方法。该问题不仅影响开发效率,而且难以通过网络资源找到确切的解决方案。本文将提供详细的步骤,帮助开发者快速解决这一常见问题。 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • feat: Enhances Jest Testing Capabilities with Snapshot Support ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • React 实现 Post 请求下载 PDF 文件的解决方案
    在 React 应用中实现通过 POST 请求下载 PDF 文件的功能,本文提供了完整的代码示例。具体实现包括设置状态以显示加载提示,并通过控制台日志记录下载索引,确保请求的正确性和用户体验。此外,还详细介绍了如何处理响应流并将其转换为可下载的 PDF 文件,适用于需要安全传输数据的场景。 ... [详细]
  • 深入探索Node.js新框架:Nest.js第六篇
    在本文中,我们将深入探讨Node.js的新框架Nest.js,并通过一个完整的示例来展示其强大功能。我们将使用多个装饰器创建一个基本控制器,该控制器提供了多种方法来访问和操作内部数据,涵盖了常见的CRUD操作。此外,我们还将详细介绍Nest.js的核心概念和最佳实践,帮助读者更好地理解和应用这一现代框架。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
author-avatar
mobiledu2502883017
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有