【问题标题】:Why Try/Catch doesn't work in phpredis connect function?为什么 Try/Catch 在 phpredis 连接功能中不起作用?
【发布时间】:2019-04-24 16:06:41
【问题描述】:

我通过 phpredis 使用 redis 作为缓存存储。它工作得很好,我想提供一些故障安全的方法来确保缓存功能始终处于启动状态(例如,使用基于文件的缓存),即使 redis 服务器出现故障,最初我也想出了以下代码

<?php
    $redis=new Redis();
    try {
        $redis->connect('127.0.0.1', 6379);
    } catch (Exception $e) {
        // tried changing to RedisException, didn't work either
        // insert codes that'll deal with situations when connection to the redis server is not good
        die( "Cannot connect to redis server:".$e->getMessage() );
    }
    $redis->setex('somekey', 60, 'some value');

但是当redis服务器关闭时,我得到了

    PHP Fatal error:  Uncaught exception 'RedisException' with message 'Redis server went away' in /var/www/2.php:10
Stack trace:
#0 /var/www/2.php(10): Redis->setex('somekey', 60, 'some value')
#1 {main}
  thrown in /var/www/2.php on line 10

catch 块没有被执行的代码。我回去阅读了 phpredis 文档并提出了以下解决方案

<?php
    $redis=new Redis();
    $connected= $redis->connect('127.0.0.1', 6379);
    if(!$connected) {
        // some other code to handle connection problem
        die( "Cannot connect to redis server.\n" );
    }
    $redis->setex('somekey', 60, 'some value');

我可以忍受,但我的好奇心永远不会得到满足,所以我的问题来了:为什么 try/catch 方法不适用于连接错误?

【问题讨论】:

  • 如果连接失败,$redis-&gt;connect(); 不会抛出异常。您可以做的是检查 $redis===true 是否为 true,如果为 true,则您已连接,否则您未连接。但正如 Nicolas 在下面指出的,上面的异常来自 setex,因此除非你将它放在 try catch 块中,否则它不会被捕获。
  • @haluk Redis 连接方法抛出异常。

标签: redis try-catch


【解决方案1】:

您的异常是从 setex 发送的,它位于 try {} 块之外。将 setex 放入 try 块中,异常就会被捕获。

【讨论】:

  • 我认为他希望捕获有关服务不可用的异常以及格式错误的命令的异常。
【解决方案2】:

正如 Nicolas 所说,异常来自 setex,但您可以通过使用 ping 命令来避免这种情况(甚至是 try/catch 块):

$redis=new Redis();
$redis->connect('127.0.0.1', 6379);

if(!$redis->ping())
{
    die( "Cannot connect to redis server.\n" );
}

$redis->setex('somekey', 60, 'some value');

【讨论】:

  • 感谢您的回答,但我不明白为什么使用额外的命令(在您的回答中 ping)比仅检查 connect() 的结果更好,这正是我实际使用的我的代码。
【解决方案3】:

如果你捕捉到'\Predis\Connection\ConnectionException',它将能够捕捉到连接异常。

或者您可以使用 \Exception 而不是 Exception(注意前面的正斜杠)。

【讨论】:

  • 这是不正确的。您提到的异常\Predis\Connection\ConnectionException 是由Predis client 引发的,而不是phpredis
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多