Yii 1.1+PHP5.6如何静默跳过Redis连接错误?
问题出在Redis扩展的默认行为上!
你遇到的问题核心是:Redis扩展的connect()方法默认不会抛出异常,它只会返回false,同时抛出一个PHP警告(也就是你日志里看到的Redis::connect(): connect() failed: Connection refused)。而Yii的错误处理机制会把这类警告提升为致命错误,最终导致HTTP 500,你的catch块根本没机会触发——因为本来就没有抛出Error或者Throwable类型的异常。
解决方法:让Redis连接失败时抛出异常
只需要给Redis实例设置一个错误模式选项,强制它在出错时抛出RedisException,这样你的try/catch就能正常捕获并静默跳过了。修正后的代码如下:
try { $r = new Redis(); // 关键:设置错误模式为抛出异常 $r->setOption(Redis::OPT_ERROR_MODE, Redis::ERR_EXCEPTION); $r->connect("127.0.0.1", 6379); // 这里写你读取Redis额外信息的逻辑 } catch (RedisException $e) { // 连接失败,静默跳过,啥也不用干 }
为什么原来的代码没用?
再给你捋清楚逻辑:
- 默认情况下,
Redis::connect()失败时只会返回false,同时产生E_WARNING级别的警告。 - Yii的错误处理器(默认配置下)会把
E_WARNING这类警告转化为可终止执行的错误,直接触发500页面。 - 你的
catch块是用来捕获抛出的异常/错误对象,但这个场景下根本没有抛出任何对象,所以完全没起作用。
备选方案(不推荐,但可以应急)
如果你不想修改Redis的错误模式,也可以临时抑制警告并检查返回值,但这种方式不够优雅,而且可能掩盖其他潜在问题:
$r = new Redis(); // 用@抑制警告,同时检查连接结果 if (@$r->connect("127.0.0.1", 6379)) { // 连接成功,执行读取逻辑 } // 连接失败就静默跳过,不需要额外处理
还是推荐第一种设置异常模式的方式,更符合现代PHP的错误处理规范,也更容易维护。
内容的提问来源于stack exchange,提问作者Denis Kulagin
相关产品推荐
相关产品推荐

