Laravel如何优雅的使用Swoole

背景

正在做一个智能家居的项目(钱低的吓死人怎么办),接收下位机(就是控制智能家居硬件模块的HUB)协议解析,Web端维护硬件状态,利用APP交互。由于下位机数据是发送到服务器的XXX端口,所以必须对XXX端口进行监听。其实和聊天室的概念差不多,研究了一下workerman、swoole和其他几个开源的项目,决定采用swoole。

关于php解析下位机的16进制协议,其实相当之扯蛋,要是你最好还是用.NET或者JAVA吧。很久没碰MVC了,光是为解析协议写webservice觉得钱又太TM低了,哈哈哈,所以直接上PHP吧。网上搜搜还没见几个php这样搞的项目,我还没做完,做完了来谈谈,关键函数主要是bin2hex/pack/unpack。这一篇主要聊聊Laravel如何优雅的使用Swoole,其实只需简单3步就可以完成。

什么是Swoole

直接套用Swoole官网的介绍:PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。

Swoole官网的文档不够丰富啊,这比较头疼,但大部分的问题都解释了。如果你对Swoole很感兴趣,那么看看这个Swoole入门教程。Swoole提供了多线程、长连接等很多牛逼的功能,把php上升到了一个新的台阶,具体的你可以看看入门教程,本文只限于讨论Laravel和Swoole的结合。

Swoole为了提供服务,必须以CLI模式运行,什么是CLI模式呢?如果你Swoole业务代码是写在一个叫server.php的文件中,那么在命令行下输入php server.php开启。这是比较头疼的事情,因为Laravel框架可不是这样的运转的,那如何能与Laravel结合呢?没错,自定义一条Artisan Command,就这么简单。

STEP 1-自定义Command

关于自定义Artisan Commnad,你需要了解的技术点都在这里,我自定义了一个叫做SwooleCommand的命令,直接贴关键代码:

fire是入口

在命令行(CLI)下执行php artisan swoole start即可开启Swoole服务。分析一下代码,你可以看到命令参数包括启动、重启、关闭,我图省事只实现了启动部分,如果需要关闭,在linux中利用kill命令关闭进程,步骤挺简单的:

1.执行 ps -aux|grep artisan命令,获取pid(有多个进程,杀第一个即可)
2.执行 kill pid命令,pid是第一步你获取的

关于Swoole的配置不是本文讨论的范围,请移步官网,这里把Swoole服务用$serv变量进行了保存,是为了后面Laravel发送命令交互。你可以看到,Swoole的事件响应代码是这样的:

用Handler处理事件响应

如果说fire打开了Swoole的大门,那么这里的handler就是Swoole与Laravel的传送带,利用自己写的handler,就可以把各种业务逻辑写进Laravel框架中,然后就可以使用Laravel提供的各种高效方便的功能了。“handler”是一种命名习惯,你也可以叫做"callback"、"manager"、"listener",这看你的命名习惯了。我没有采用new的方式而是用Laravel的IoC注入App::make,主要是图省事(因为handler的构造器用到了我自定义的数据处理类,往下看)。

STEP 2-自定义handler

因为是自定义的类,请遵循命名空间,并在composer.json中声明,完了执行composer dump-autoload命令更新一遍。比如我创建了一个文件夹app\handlers存放handler,那么在composer.json中看起来是这样的:

autoload不能少

那么handler里面具体干些啥,就由你来决定了。反正和写controller差不多,各种Laravel框架的功能你都能随便用,贴上我的:

上一节我提到我用IoC是因为构造器里面用到了自己的数据处理类,我把增删改查和其他数据处理的业务放到Repository中了,没其他原因,只是这样代码看起来清爽一点。如此,利用Swoole接收数据的流程就算搞定了,那么要想利用Swoole向客户端发送数据该怎么做呢?咳咳,这个稍微麻烦点,需要曲线方法实现,继续看下一节。

STEP 3-发送数据

有两种方法,但都离不开一个缓存kv结构(Laravel自带的Cache功能就够了),保存客户端的地址数据,要不你怎么知道发到哪里去。我用的是第一种,图省事,发送数据和Swoole就无关了,如果你需要长连接websocket,这种不适用,老老实实用第二种吧。如果你有更好的办法,请一定要告诉我!

第一种:fsockopen

挺简单的,和swoole就没关系了,利用Swoole的connection_info函数获取客户端的IP地址和端口,然后用fsockopen直接发送数据。

第二种:内部端口监听

Swoole支持监听多个端口,实现的思想就是利用fsockopen把数据利用内部监听的端口发送过去,然后就可以调用$serv发送消息了。这么做的好处就是不需要知道客户端的实际IP地址和端口,在Cache保存客户端的$fd标识,直接就发数据。采用这个思路,请记得iptables把端口打开。我自己并没有采用,因为不是长连接我觉得太麻烦。

总结

Swoole非常棒,其实都没怎么用上(项目钱给够再说吧)。你还可以参考官网的配置,将Swoole作为nginx承载代理,据说性能提升很大。qq群533838427

时间: 2024-10-16 04:02:11

Laravel如何优雅的使用Swoole的相关文章

基于Laravel+Swoole开发智能家居后端

基于Laravel+Swoole开发智能家居后端 在上一篇<Laravel如何优雅的使用Swoole>中我已经大概谈到了Laravel结合Swoole的用法. 今天,我参与的智能家居项目基本上已经结束了Web服务器及android端的开发(熬了个通宵突击把剩下的做了,好累), 趁热来聊聊基于Laravel+Swoole开发智能家居后端的关键技术点. 16进制ASCII码协议的解析 硬件我不谈,我只需要关心数据解析.如何基于Swoole如果在php中解析16进制的ascii码,这种文章还比较少呢

Swoole

Swoole Laravel如何优雅的使用Swoole 背景 正在做一个智能家居的项目(钱低的吓死人怎么办),接收下位机(就是控制智能家居硬件模块的HUB)协议解析,Web端维护硬件状态,利用APP交互.由于下位机数据是发送到服务器的XXX端口,所以必须对XXX端口进行监听.其实和聊天室的概念差不多,研究了一下workerman.swoole和其他几个开源的项目,决定采用swoole. 关于php解析下位机的16进制协议,其实相当之扯蛋,要是你最好还是用.NET或者JAVA吧.很久没碰MVC了,

同步效率差不多CAS相比synchronized没有获得更高的性能

对于资源竞争较少的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源:而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能. 希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了. ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要

使用 Laravel 数据填充功能生成中文测试数据

今晚--不对,是昨晚,折腾一个的小项目,发现自动填充的中文数据显示起来总不太美观,于是开始琢磨如何填充中文数据进行测试. 然而一番搜索后惊奇的发现,官方.以及一些非官方的文档均未提及这一功能.期间看到一篇他人的"经验"文章,虽然可以实现这一需求,却要求修改 vendor 目录下 fzaninotto/Faker 包的源码,对于一个中了 Laravel 的"优雅之毒"的人来说,怎能容忍如此风骚的操作? 一定有更好的办法-- 继续理清 Laravel 模型工厂原理之后,

疫情在家没事做推荐个学习的目录:怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新)

面试题系列: 分享一波腾讯PHP面试题 2019年PHP最新面试题(含答案) Redis 高级面试题 学会这些还怕进不了大厂? 阿里面试官三年经验PHP程序员知识点汇总,学会你就是下一个阿里人! php面试题之PHP核心技术 掌握 Redis这些 知识点,面试官一定觉得你很 NB 当面试官问你:如何进行性能优化? PHP 经典面试题集 其他: 使用 PHP 7.4 的 PHP 有什么新功能? Go 与 PHP 的语法对比 Thinkphp系列: ThinkPHP6源码分析之应用初始化 Think

2016 Web开发资源工具大搜罗

来源于:https://zhuanlan.zhihu.com/p/22730771 作者:余博伦链接:https://zhuanlan.zhihu.com/p/22730771来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Web的迅猛发展对于开发者来说既是一件好事也是一件坏事.不断紧跟潮流学习新的技术.编程语言.适应变化听起来就很令人兴奋又紧张.你需要面对的挑战可能包括使用已有的框架适应新的业务需求,测试网站的兼容性,优化你的网站前端和后端更好地协同.今天在这里

Lumen中启用session

原文链接:http://www.jianshu.com/p/dc33f8ab0618 Lumen5.2 的Release Notes中官方明确的指出Lumen专注于构建无状态API,JSON API 服务,移除了session和view的支持,但其实view还是存在的,session确实真的被移除了 因为项目需要所以我决定找回session,虽然官方建议需要session功能时可以使用强大的Laravel框架,但是对我小项目确实有点大材小用了.因为喜欢Laravel的优雅,所以我在小项目中都会把

使用 Swoole 来加速你的 Laravel 应用

Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTTP, WebSocket 服务, 而不需要拥有太多的非阻塞 I/O 编程和低级别的 Linux 内核知识. 你可以把 Swoole 想象成 NodeJS, 但对于 PHP 来说将有更高性能. 为什么要在 Swoole 上运行 Laravel?下图展示了 PHP 的生命周期.正如你所看到的那样,当你每

优雅的 laravel(1)- Composer概述及其自动加载探秘

刚开始接触laravel,一天时间走马观花的看了一些官方文档之后便开始了laravel的学习.这里谈到的都是最基础的东西,各路大神,可直接略过. composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具库,Composer就会帮你安装这些依赖的库文件.运行 Composer 需要 PHP 5.3.2+ 以上版本. 使用composer 第一步,声明依赖关