2013-08-06 21 views
5

"Fatal error PHP: eccezione Uncaught 'RedisException' con il messaggio 'errore di lettura sulla connessione'"Timeout Redis PHP, errore di lettura sulla connessione?

Il driver qui è phpredis

$redis->blpop('a', 0); 

Questo sempre momenti dopo ~ 1 minuto. Il mio redis.conf dice timeout 0 e $redis->getOption(Redis::OPT_READ_TIMEOUT) ritorna double(0)

Se faccio questo non è mai scaduto $redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

Perché ho bisogno di -1? La documentazione di Redis dice che timeout 0 in redis.conf non dovrebbe mai scadere.

"Per impostazione predefinita, le versioni recenti di Redis non chiudono la connessione con il client se il client è inattivo per molti secondi: la connessione rimarrà aperta per sempre."

risposta

10

La soluzione corrente che conosco è disabilitare le connessioni persistenti per phpredis, come sono state reported as buggy since October 2011. Se stai usando php-fpm o altri modelli filettati, la libreria specifically disables persistent connections.

Ridurre la frequenza di questo errore potrebbe essere possibile tramite adjusting the php.ini default_socket_timeout value.

Inoltre, la lettura delle configurazioni di timeout in phpredis non è supportata universalmente. La funzione (cercare OPT_READ_TIMEOUT) era introduced in tag 2.2.3.

1

Dopo un sacco di studio di articoli e facendo il mio strace di redis e php, sembrava che il problema è stato risolto facilmente da questo solution. Il problema principale nel mio caso d'uso era che il server redis non è in grado di eseguire il fork di un processo verso il salvataggio delle scritture in memoria sul db on-disk.

Ho lasciato tutti i valori di timeout in php.ini e redis.conf come erano senza aver apportato le modifiche hacky e ho quindi provato la soluzione di cui sopra, e questo problema 'leggere l'errore sulla connessione' che era non risolvibile usando tutti i suggerimenti su come cambiare i valori di timeout tra i file conf di php e redis sono andati via.

Ho anche visto alcuni suggerimenti su come aumentare il limite per i descrittori di file su 100000 ecc. Sto eseguendo il mio caso d'uso su un server cloud con limite di descrittore di file a 1024 e il mio caso d'uso funziona perfettamente con quel limite.

0

Aggiungo il codice ini_set(‘default_socket_timeout’, -1) nel mio programma php, ma ho scoperto che non funzionava immediatamente.

Tuttavia, dopo tre minuti, quando ho iniziato a correre di nuovo il programma php, finalmente ho trovato il motivo, la connessione Redis non è persistente

Poi ho impostato timeout=0 nel mio redis.conf, problema risolto!

+0

Provare a formattare per una lettura migliore –

1
$redis->connect(host, port, timeout1); 

.....

$redis->blpop($key, timeout2); 

In quale tiemout1 deve più di timeout2.