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?
'$ 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
@haluk Il metodo di connessione Redis genera un'eccezione. –