Tôi đang sử dụng redis làm cửa hàng bộ nhớ đệm thông qua phpredis. Nó hoạt động hoàn hảo và tôi muốn cung cấp một số cách không an toàn để đảm bảo tính năng lưu vào bộ đệm luôn luôn (sử dụng bộ nhớ đệm dựa trên tệp), ngay cả khi máy chủ redis bị hỏng, ban đầu tôi đã đưa ra mã sau đâyTại sao Try/Catch không hoạt động trong chức năng kết nối phpredis?
<?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');
Nhưng khi máy chủ redis là xuống, tôi đã
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
mã khối catch không được thực thi. Tôi quay trở lại để đọc doc phpredis và đã đưa ra các giải pháp sau đây thay vì
<?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');
tôi có thể sống với điều đó nhưng sự tò mò của tôi sẽ không bao giờ có được hài lòng vì ở đây có câu hỏi của tôi: tại sao lần thử phương pháp/catch không làm việc với lỗi kết nối?
'$ redis-> connect();' không ném ngoại lệ nếu kết nối không thành công. Những gì bạn có thể làm là kiểm tra xem $ redis === có đúng không, nếu đúng thì bạn đã kết nối, nếu không bạn không được kết nối. Nhưng như ghi chú của Nicolas bên dưới, ngoại lệ ở trên là từ setex, do đó nó sẽ không bị bắt trừ khi bạn đặt nó trong khối try try. – Haluk
@haluk Redis kết nối phương pháp ném một ngoại lệ. –