Swoole

Swoole

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-19 04:33:38

Swoole的相关文章

php安装swoole扩展

编译安装 Swoole扩展是按照php标准扩展构建的.使用phpize来生成php编译配置,./configure来做编译配置检测,make进行编译,make install进行安装. 请下载releases版本的swoole,直接从github主干上拉取最新代码可能会编译不过 如果当前用户不是root,可能没有php目录的写权限,安装时需要sudo或者su 如果是在git分支上直接git pull更新代码,重新编译前务必要执行make clean 安装准备 安装swoole前必须保证系统已经安

[PHP] swoole在daemonize模式下,chdir失效问题

swoole version: 1.9.6 其实跟swoole的版本无关,因为原代码体系,fpm模式下,在启动的时候,是使用 chdir 函数改变了当前目录的,而其它代码在做类的自动加载的时候,都是写的相对地址,而不是绝对地址. 问题就来了,swoole是多进程的,在daemonize模式下,chdir改变当前目录,在其它进程下是不生效的,所以有时候,不使用daemonize没问题,而使用daemonize会莫名的出现找不到类的情况. 解决方法是,在几个启动的回调里面同时也改变一下目录 $ser

使用swoole和websocket结合来制造弹幕

在知乎上无意中看到了一篇有关这个的话题https://zhuanlan.zhihu.com/p/23992890,刚好没事也好久没弄swoole了就自己按照知乎上的那篇文站实操了一下 那个试验中有几个点需要注意一下: 1.首先得安装php的swoole扩展 pecl install swoole  用php -m检查扩展是否安好 2.jquery包和弹幕所需要的包最好用他那个dist中的文件,不然的话有可能页面js会报错 3. liunx发行版安装php5.3+并且编译swoole扩展,在php

被swoole坑哭的PHP程序员

本文主要记录一下学习swoole的过程.填过的坑以及swoole究竟有多么强大! 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强大功能.外界对其的崇拜便跃跃欲试的安装.调试其demo.编写新功能,然后兴奋的奔走相告.没过几天当你按照自己的理解继续用swoole时,发现代码并没有按照自己的预期运行,然后开始破口大骂,什么破东西呀,代码跟demo基本一样,为啥运行不通呢?什么狗屁work.task.共享内存.ipcs.异步,各种问题涌现,然后迅速去

swoole扩展安装

1Swoole扩展的编译安装 Swoole扩展是按照php标准扩展构建的.使用phpize来生成php编译配置,./configure来做编译配置检测,make和make install来完成安装. 下载releases版本的swoole cd swoole phpize ./configure make && sudo make install 成功后,修改php.ini加入extension=swoole.so.通过php -m或phpinfo()来查看是否成功加载了swoole扩展.

swoole 异步队列

<?php // 消费者,文件名<server.php> class Server { private $serv; public function __construct() { $this->serv = new swoole_server("0.0.0.0", 9501); $this->serv->set(array( 'worker_num' => 1, // 一般设置为服务器CPU数的1-4倍 'daemonize' => f

Swoole源代码学习记录(十三)——Server模块具体解释(上)

Swoole版本号:1.7.5-stable Github地址:https://github.com/LinkedDestiny/swoole-src-analysis 最终能够正式进入Server.c模块了-- 在之前的分析中,能够看到非常多相关模块的声明都已经写在了Server.h中,就是由于这些模块构成了Server的核心部分.而Server本身,则是一个最上层的对象,它包含了核心的Reactor和Factory模块,存放了消息队列的key值,控制着所有的Connection.所有PHP层

使用swoole进行消息推送通知,配合vb.net进行客户端开发一样爽

在以前的项目中,就曾听说过swoole的大名,想用来进行消息推送,但是当时只是有了初步的了解,并不敢大胆的运用到线上产品.所谓 识不足则多虑,威不足则多怒.所以就是怕,只能跟领导说了运用极光的推送功能,而且还说出了一定的理由,领导自然也只有相信了,那就用极光推送吧! 最近闲来无事,又重新温习了一下swoole的消息通知功能,虽然在项目开发当时,也曾实现过简单的操作的,但是这次温习更加深了学习,配合vb.net进行开发,感觉还是棒棒哒,下面是一套实现过程,如有需要参考,请拿去,不谢! 首先,我的开

一、swoole安装

说明:swoole扩展需要安装php环境,这里就不说了. 1.有了PHP环境后,即可安装swoole扩展. swoole扩展下载地址:https://github.com/swoole/swoole-src/releases 尽量选择stable版本,alpha版本最好仅用于实验新特性. 解压源码至任意目录,执行如下命令: cd swoole-src-swoole-1.7.20-stable/ phpize ./configure --with-php-config=/server/apps/p

ubuntu 安装 swoole 和mac 安装swoole 扩展

ubuntu php 安装swoole 比较容易 1. 从git下载源码 2. 下载pcre http://sourceforge.net/projects/pcre/files/pcre/8.36/ ./configure make &make install 3. 进入swoole 源码 phpize ./cofigure make &make install 编辑php.ini 添加extension = swoole.so 重启apache 生效 mac 安装swoole 我的ma