MixPHP V2.1 生态: Swoole 协程 Redis 订阅器
在 OpenMix 全家桶 中有一个 Mix Redis Subscribe 的项目,这是一个不依赖 phpredis 扩展,直接解析 Redis 协议专用于订阅处理的一个库,任何 Swoole 框架都可使用,可广泛使用于 WebSocket 开发中,在 MixPHP 骨架中也默认包含了这个库。
为何开发
MixPHP V2.1 完成开发后,我试图开发一个基于订阅机制的 WebScoket 服务,该服务需要可动态切换订阅频道,但 phpredis 的订阅方法无法实现以下功能:
$redis = new \Redis(); $res = $redis->pconnect('127.0.0.1', 6379, 0); $redis->subscribe(['test'], function ($instance, $channelName, $message) { echo $channelName, "==>", $message, PHP_EOL; });
- 无法得知订阅成功
以上代码中,当执行到 subscribe 会阻塞执行,只有在有消息过来时才会执行到匿名函数中,并不会在订阅成功的当时执行该闭包,但是 redis-cli 执行订阅时,redis-server 是有回复订阅成功消息的,因此是 phpredis 的设计问题。
- 无法动态 subscribe 增加频道
由于 subscribe 阻塞了执行,代码只能在有消息触发回调时才能在回调中执行,因此动态增加频道也是无法操作的。
- unsubscribe 只可在回调中执行
因为上面那种阻塞回调的设计,如果需要取消一个频道,只能在有消息过来时方可操作,但是实际需求通常是需要在任意时刻都可取消频道。
- 无法在其他协程中 close 连接
phpredis 当试图在匿名函数以外的其他协程中 close 连接会抛出异常 PHP Fatal error: Uncaught RedisException: read error on connection
,这让关闭一个订阅中的 redis 连接都无法优雅的实现。
造轮子
当我得知 redis 协议是简单的文本协议时,我决定抛弃 phpredis 自己造一个好用的订阅库,新轮子具有以下优点:
- 不依赖 phpredis 扩展
- 平滑修改:可随时增加、取消订阅通道,实现无缝切换通道的需求。
- 跨协程安全关闭:可在任意时刻关闭订阅。
- 通道获取消息:该库封装风格参考 golang 语言 go-redis 库封装,通过 channel 获取订阅的消息。
$sub = new \Mix\Redis\Subscribe\Subscriber([ // 连接失败将抛出异常 'host' => '192.168.198.1', 'port' => 6379, 'timeout' => 5, 'password' => '', ]); $sub->subscribe('foo', 'bar'); // 订阅失败将抛出异常 $chan = $sub->channel(); while (true) { $data = $chan->pop(); if (empty($data)) { // 手动close与redis异常断开都会导致返回false if (!$sub->closed) { // redis异常断开处理 var_dump('Redis connection is disconnected abnormally'); } break; } var_dump($data); }
接收到订阅消息:
object(Mix\Redis\Subscribe\Message)#8 (2) { ["channel"]=> string(2) "foo" ["payload"]=> string(4) "test" }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Windows 7 下周停止支持:KDE 社区拉拢用户使用 Linux 发行版
KDE社区近日分享了关于如何帮助Windows 7系统用户在2020年1月14日停止支持之后,将其迁移到Linux平台和Plasma桌面环境的详细举措。 自下周(1月14日)开始,微软不再为Windows 7用户提供更新和安全补丁,意味着如果不升级至Windows 10或者其他操作系统(例如macOS、GNU/Linux发行版本)的话就会成为黑客和各种威胁的目标。 对于那些不希望升级Windows10,但又希望获得安全保护的Windows 7用户,KDE社区希望拉拢这批用户尝试安装搭载Plasm桌面环境的GNU/Linux发行版本,这些发行版本能够非常轻松的切换到和Windows 7相似外观和操作逻辑的KDE主题上,并能提供Linux的安全性和稳定性功能。 KDE在社区中写道:“与其迁移到Windows 10系统,忍受数小时的更新,内嵌到应用中的各种广告,还不如安装Plasma桌面环境的的Linux操作系统。你只需要30分钟就能完成启动和运行,并且具备Plasma的所有功能和易用性,以及Linux平台提供的安全性和稳定性。” 当然,Windows 7用户可能会问的第一个问题就是,我喜欢...
- 下一篇
Spyder 4.0.1 发布,优秀的Python集成开发环境
Spyder是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑、变量监视、交互测试、调试等特性,支持包括 Windows、Linux 和 OS X 系统。 Anaconda集成了Spyder安装包,可以通过Anaconda环境安装最新的Spyder 4.0.1版本: conda install spyder=4.0.1 Spyder 4带来一些非常棒的特性更新,以及对窗口面板重新命名: Static code analysistoCode Analysis File explorertoFiles Find in filestoFind History logtoHistory Project explorertoProject Editor Code folding. Indentation guides. A class/method/function lookup panel. This can be shown in the menu Source > Show selector for classes and functions. Autosave ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能