Я использую Redis как хранилище для кэширования через phpredis. Он отлично работает, и я хочу предоставить какой-нибудь надежный способ убедиться, что функция кэширования всегда включена (например, с использованием файлового кэширования), даже когда сервер 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 не работает с ошибкой соединения?