swoole android 长链接,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的命令,直接贴关键代码:

a9b12505096f615135b5f2fc4df9f4ea.png

fire是入口

在命令行(CLI)下执行php artisan swoole start即可开启Swoole服务。分析一下代码,你可以看到命令参数包括启动、重启、关闭,我图省事只实现了启动部分,如果需穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq52LHVo6zU2mxpbnV41tDA+9PDa2lsbMP8we652LHVvfizzKOssr3W6M2mvPK1pbXEOjwvcD4KPHByZSBjbGFzcz0="hljs perl">1.执行 ps -aux|grep artisan命令,获取pid(有多个进程,杀第一个即可)

2.执行 kill pid命令,pid是第一步你获取的

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

106e5a05d426ffb352efb1c9b081c8e5.png

用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中看起来是这样的:

82e95040fe43315b437ed4f481465967.png

autoload不能少

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

9a4893450e6b131f7e243e48034caa61.pngqq群533838427

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Laravel使用 Swoole 扩展来实现 WebSocket 连接非常简单。以下是配置 WebSocket 连接及实现 pingpong 的步骤: 1. 安装 Swoole 扩展 使用 Composer 安装 Swoole 扩展: ``` composer require swoole/swoole ``` 2. 创建 WebSocket 服务器 在 Laravel 中创建 WebSocket 服务器需要使用 Swoole 扩展自带的 `WebSocket\Server` 类。 在 `app/Providers/AppServiceProvider.php` 文件中,注册 Swoole WebSocket 服务器: ```php use Swoole\WebSocket\Server; public function register() { $this->app->singleton(Server::class, function ($app) { $server = new Server('0.0.0.0', 9501); $server->set([ 'worker_num' => 4, 'daemonize' => env('APP_ENV') === 'production', ]); return $server; }); } ``` 在上面的代码中,我们定义了一个 WebSocket 服务器,并设置了 `worker_num` 和 `daemonize` 参数。 3. 实现 WebSocket 连接 在 Laravel 中,可以通过 Swoole WebSocket 服务器的 `on` 方法来实现 WebSocket 连接。 在 `AppServiceProvider` 类中,添加以下代码: ```php use Swoole\WebSocket\Server; use Swoole\Http\Request; use Swoole\WebSocket\Frame; public function boot(Server $server) { $server->on('open', function (Server $server, Request $request) { echo "connection open: {$request->fd}\n"; }); $server->on('message', function (Server $server, Frame $frame) { echo "received message: {$frame->data}\n"; $server->push($frame->fd, "received: {$frame->data}"); }); $server->on('close', function (Server $server, $fd) { echo "connection close: {$fd}\n"; }); } ``` 在上面的代码中,我们实现了 `open`、`message` 和 `close` 事件的回调函数。 当 WebSocket 客户端与服务器建立连接时,`open` 事件被触发。我们在这里记录连接的 `$request->fd`。 当服务器接收到消息时,`message` 事件被触发。我们在这里记录接收到的消息,并将其发送回客户端。 当连接关闭时,`close` 事件被触发。我们在这里记录连接的 `$fd`。 4. 实现 pingpong WebSocket 协议规定要保持连接,需要定期发送心跳包,也就是 pingpong 消息。 在 Laravel 中,可以使用 Swoole WebSocket 服务器的 `tick` 方法来实现定时发送心跳包。 在 `AppServiceProvider` 类中,添加以下代码: ```php use Swoole\WebSocket\Server; public function boot(Server $server) { // ... $server->on('open', function (Server $server, Request $request) { // ... // 开始定时发送心跳包 $server->tick(30000, function () use ($server, $request) { $server->push($request->fd, 'ping'); }); }); // ... } ``` 在上面的代码中,我们在 `open` 事件的回调函数中,使用 `tick` 方法实现了每 30 秒发送一个 pingpong 消息。 这样就实现了 WebSocket 连接及实现 pingpong 的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值