cari
Rumahrangka kerja phpSwoolelaravel如何使用swoole

laravel如何使用swoole

Dec 12, 2019 am 10:28 AM
laravelswooleguna

laravel如何使用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的命令,直接贴关键代码:

591325acf21ea6544b620c9cd72dd3d.png

fire是入口

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

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

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

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

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

91d6f94a43011fbb96c9359be2e94f7.png

autoload不能少

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

ae68a23e340c40a568405d554e5929d.png

上一节我提到我用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承载代理,据说性能提升很大。

PHP中文网,有大量免费的Swoole入门教程,欢迎大家学习!

Atas ialah kandungan terperinci laravel如何使用swoole. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)