2012-03-26 5 views
5

Sto usando redis come archivio di memorizzazione nella cache tramite phpredis. Funziona perfettamente e voglio fornire un modo sicuro per assicurarsi che la funzione di caching sia sempre attiva (utilizzando la cache basata su file, ad esempio), anche quando il server redis si interrompe, inizialmente ho trovato il seguente codicePerché Try/Catch non funziona nella funzione di connessione di 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'); 

Ma quando il server Redis è giù, ho avuto

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 

il codice del blocco catch non è stato eseguito. Sono tornato a leggere il doc phpredis e si avvicinò con la seguente soluzione invece

<?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'); 

posso vivere con questo, ma la mia curiosità avrei mai soddisfatta ecco viene la mia domanda: perché il metodo try/catch non lo fa funziona con l'errore di connessione?

+1

'$ riscoperto> connect();' non lancia un'eccezione se una connessione fallisce semplicemente. Quello che puoi fare è controllare se $ redis === true, se è vero allora sei connesso, altrimenti non sei connesso. Ma come notato da Nicolas in basso, l'eccezione sopra è da setex, quindi non verrà catturata a meno che non la si inserisca nel blocco catch try. – Haluk

+0

@haluk Il metodo di connessione Redis genera un'eccezione. –

risposta

3

L'eccezione è stata inviata da setex, che è al di fuori del blocco try {}. Metti lo setex dentro il blocco try e l'eccezione verrà catturata.

+0

Penso che si aspetti di rilevare un'eccezione riguardante il servizio non disponibile, insieme a quello per un comando non valido. – Niloct

+1

@Niloct, hai letto la mia mente: D In effetti sarebbe bello se fosse possibile rilevare un'eccezione durante la chiamata a connect(). – ricochen

0

Come ha detto Nicolas, l'eccezione viene da Setex, ma si può evitare che (e anche il blocco try/catch) utilizzando il comando ping:

$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

Grazie per la tua risposta, ma non vedo perché usare un comando extra (ping nella tua risposta) è meglio che controllare il risultato di connect(), che è quello che sto effettivamente usando nel mio codice. – ricochen

Problemi correlati