Hyperf 默认不支持 Redis 哨兵模式,必须显式设 'host' => null、配置 sentinels 数组(至少两个完整地址+端口元素)、指定与哨兵配置完全一致的 service 名,并将主从密码写入 sentinels 元素中;否则直连哨兵导致 NOAUTH/READONLY 错误。

Hyperf 默认不支持 Redis 哨兵模式,必须显式禁用 host、启用 sentinels 数组,并指定 service 名——否则连接会直连哨兵地址,发命令就报错 NOAUTH 或 READONLY。
redis.php 中 host 必须设为 null,不能留空字符串或注释掉
Hyperf 的 RedisFactory 会检测 host 是否为空值:若为 '' 或未定义,它仍会走普通单机连接逻辑;只有 null 才触发哨兵适配分支。一旦填了任何非 null 值(包括 'localhost'),整个哨兵配置就被跳过。
-
'host' => null是强制要求,不是可选项 - 删掉
'port'字段(哨兵端口由sentinels数组各自携带,主库端口由哨兵动态返回) -
'password'若 Redis 主从有密码,必须写在sentinels数组里每个元素的'password'键中,而非顶层
sentinels 数组必须是完整地址+端口结构,且至少两个节点
Hyperf 使用的是 phpredis 扩展(非 Predis),其哨兵初始化依赖 sentinels 数组逐个尝试连接。单点配置等于无高可用——如果那个哨兵宕了,连接直接失败,不会 fallback 到其他哨兵。
- 每个数组元素格式为
['host' => '10.0.2.5', 'port' => 26379, 'password' => 'mypass'](密码仅当哨兵自身启用了requirepass才需要) - 确保所有哨兵地址能被 PHP 进程直连(
telnet 10.0.2.5 26379通) - 不要写成
redis://10.0.2.5:26379字符串——Hyperf 不解析这种 URI 格式
service 名必须与哨兵配置中的 sentinel monitor 完全一致
这个字符串是哨兵集群的“服务发现关键字”,不是 Redis 实例名,也不是域名。Hyperf 用它向任意一个哨兵发起 SENTINEL GET-MASTER-ADDR-BY-NAME <service> 请求。写错一个字母或大小写,就会返回空,最终抛出 Connection refused 或超时。
立即学习“PHP免费学习笔记(深入)”;
- 检查哨兵配置文件里的
sentinel monitor myMaster 10.0.1.10 6379 2——这里的myMaster就是你要填的service值 - 确认所有哨兵节点的
sentinel monitor行完全一致(包括空格、大小写) - 如果哨兵配置了
sentinel auth-pass myMaster redis123,Hyperf 层无需额外传密码,那是哨兵和 Redis 主库之间的认证
timeout 至少设为 2.5,避免哨兵协商阶段被误杀
哨兵模式下,Hyperf 第一次获取主节点地址要经历:连接任一哨兵 → 发送 GET-MASTER-ADDR-BY-NAME → 哨兵查主库状态 → 返回主库 IP+端口 → 再建新连接。这中间有两次网络往返,RTT 波动大时,timeout: 1.0 极易导致 Connection timed out。
- 设
'timeout' => 2.5是最低安全值,生产环境建议3.0 -
'read_timeout'和'write_timeout'可沿用默认(通常 0,即继承timeout) - 别信“本地开发快所以设 0.5”——测试环境网络抖动会暴露问题
真正容易被忽略的是:Hyperf 的 redis.php 配置在容器启动时只加载一次,改完配置必须重启服务进程,热重载不生效;另外,如果你用的是 Swoole 多协程,确保 phpredis 版本 ≥ 5.3.0(php --ri redis | grep Version),低版本会在后台静默降级为直连单节点,故障时完全没提示。



















