2012-03-26 23 views
5

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?

+1

'$ 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

+0

@haluk Redis kết nối phương pháp ném một ngoại lệ. –

Trả lời

3

Ngoại lệ của bạn đã được gửi từ setex, nằm ngoài khối try {}. Đặt setex bên trong khối try và ngoại lệ sẽ bị bắt.

+0

Tôi nghĩ rằng anh ta đang mong đợi để bắt một ngoại lệ liên quan đến dịch vụ không có sẵn, cùng với một cho một lệnh không đúng định dạng. – Niloct

+1

@Niloct, bạn đọc được suy nghĩ của tôi: D Thật vậy, sẽ rất tuyệt nếu ngoại lệ có thể bị bắt khi đang gọi connect(). – ricochen

0

Như Nicolas cho biết, ngoại trừ xuất phát từ setex, nhưng bạn có thể tránh điều đó (và thậm chí try/catch block) bằng công ping lệnh:

$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'); 
+6

Cảm ơn câu trả lời của bạn nhưng tôi không thấy lý do tại sao sử dụng lệnh bổ sung (ping trong câu trả lời của bạn) tốt hơn là chỉ kiểm tra kết quả từ connect(), đó là những gì tôi đang thực sự sử dụng trong mã của mình. – ricochen

Các vấn đề liên quan