0

0

Yii框架的Redis消息队列_发布订阅模式实现实时通知【教程】

雪夜

雪夜

发布时间:2026-03-12 09:21:13

|

236人浏览过

|

来源于php中文网

原创

yii框架中redis发布订阅不可用于web请求,仅支持独立常驻进程;需绕过框架封装,用predis客户端手动实现subscribe,并配supervisord看护进程。

yii框架的redis消息队列_发布订阅模式实现实时通知【教程】

Yii 框架里用 Redis 发布订阅做实时通知,不是不行,但得绕开框架封装直接操作连接——否则你会收不到消息、卡住进程、甚至让 Web 请求阻塞。

Redis subscribe 不能在 Yii 的 Web 请求生命周期里调用

Yii 默认用的是同步阻塞式 Redis 客户端(比如 yii\redis\Connection),而 subscribe 是长连接+事件循环操作,一旦调用就会卡死当前 PHP 进程,Web 响应永远不返回。

  • 别在控制器 action 或视图里写 $redis->subscribe(...),这等于主动挂起 HTTP 请求
  • 如果你看到页面白屏、超时、或日志里反复出现 PHP Warning: proc_open(): fork failed,大概率是误用了阻塞订阅
  • 真正可行的场景只有:独立运行的常驻进程(如基于 php yii redis/listen 的命令行脚本)

yii\redis\Connection 手动获取原生连接再 pubsub

Yii 的 Redis 组件本身不暴露 pubsub 方法,但你可以从 Connection 实例里拿到底层 Predis\ClientRedis 对象,再调用原生方法。

ColorMagic
ColorMagic

AI调色板生成工具

下载
  • 确认你用的是 predis 驱动('class' => 'Predis\Client'),因为原生 Redis 扩展对 pubsub 支持更弱
  • 在命令行脚本中这样拿连接:$client = Yii::$app->redis->getMaster()->getConnection()->getSocket(); 不行 —— 正确做法是:$client = Yii::$app->redis->redis; // 直接访问 protected 属性需确保驱动兼容;更稳的方式是新建一个 Predis\Client 实例,复用相同配置
  • 示例片段(CLI 脚本):
    $client = new \Predis\Client(['scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379]);
    $client->subscribe(['notify:order'], function ($redis, $channel, $message) {
        echo "收到通知: {$message}\n";
        // 处理逻辑,比如更新数据库、发邮件
    });

Web 端接收不到消息?你缺的是客户端轮询或 WebSocket 桥接

PHP 无法在浏览器里“实时监听” Redis 频道,必须靠前端主动拉取或通过中间服务转发。

  • 别指望用 AJAX 轮询 /api/notifications 接口去查 Redis 列表(lpop)——这不算发布订阅,只是队列消费,且轮询频率难平衡
  • 真正贴近“实时”的方案是加一层轻量 WebSocket 服务(如 workermanswoole),它连 Redis 订阅,再把消息推给指定用户 socket
  • 如果只用 Yii,最简方案是:后端用命令行脚本消费频道,把消息存进数据库或缓存(如 cache/notify:{user_id}),前端用 fetch 定期查这个 key

Redis 发布订阅在 Yii 里从来就不是开箱即用的功能,它要求你清楚区分「谁负责监听」和「谁负责展示」。最容易被忽略的一点是:订阅进程崩溃后不会自动重启,必须配 supervisordsystemd 看护,否则通知就断了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
swoole为什么能常驻内存
swoole为什么能常驻内存

swoole常驻内存的特性:1. 事件驱动模型减少内存消耗;2. 协程并行执行任务占用更少内存;3. 协程池预分配协程消除创建开销;4. 静态变量保留状态减少内存分配;5. 共享内存跨协程共享数据降低内存开销。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

306

2024.04.10

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

166

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

170

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

124

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

257

2024.09.24

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1923

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2392

2025.12.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号