2012-08-02 16 views
12

Sto usando predis e il suo abbonamento a un canale e l'ascolto, genera l'errore e muore, mostrato di seguito, dopo 60 secondi in modo esatto, non è sicuramente il mio errore del server web o il suo timeout."Errore durante la lettura della linea dal server"

C'è un problema simile in discussione here. Non ce l'ha fatta

Ho provato a impostare connection_timeout nel file predis conf su 0, ma non aiuta molto.

Anche se continuo a utilizzare (inviare dati ad esso e elabora) l'operatore non dà alcun errore. Quindi è probabilmente un timeout da qualche parte, e anche questo in connessione.

Ecco il mio frammento di codice, che probabilmente genera errore, perché se i dati vengono dati al lavoratore, esegue questo codice e va avanti, il che non produce alcun errore.

$pubsub = $redis->pubSub(); 
$pubsub->subscribe($channel1); 

foreach ($pubsub as $message) { //doing stuff here and unsubscribing from channel 
} 

Trace

PHP Fatal error: Uncaught exception 'Predis\Network\ConnectionException' with message 'Error while reading line from the server' in Predis/Network/ConnectionBase.php:159 Stack trace: 
#0 library/vendor/predis/lib/Predis/Network/StreamConnection.php(195): Predis\Network\ConnectionBase->onConnectionError('Error while rea...') 
#1 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(259): Predis\Network\StreamConnection->read() 
#2 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(206): Predis\PubSub\PubSubContext->getValue() 
#3 pdf/file.php(16): Predis\PubSub\PubSubContext->current() 
#4 {main} thrown in Predis/Network/ConnectionBase.php on line 159 

Controllato il timeout redis.conf troppo, la sua anche disabilitato.

+0

puoi collegarti a redis fine usando redis-cli? –

+0

sì, anche il lavoratore sta funzionando bene se i dati vengono elaborati, se rimane per 60 sec, muore e dà l'errore – amitchhajer

risposta

30

Basta impostare il parametro di connessione read_write_timeout su 0 o -1 per risolvere il problema. per esempio.

$redis = new Predis\Client('tcp://10.0.0.1:6379'."?read_write_timeout=0"); 

L'impostazione dei parametri di connessione è documented in the README. L'autore del Redis ha notato l'importanza del parametro read_write_timeout a questo errore in an issue on GitHub, in cui egli osserva che:

Se si utilizza Predis in uno script daemon-come si dovrebbe impostare read_write_timeout a -1 se si vuole disabilitare completamente il timeout (questo valore funziona con le versioni precedenti e successive di Predis). Inoltre, è necessario ricordare che è necessario disabilitare il timeout predefinito di Redis impostando timeout = 0 in redis.conf oppure Redis interromperà la connessione dei client inattivi dopo 300 secondi di inattività.

+9

Se stai usando Laravel, aggiungi 'read_write_timeout' => -1 in Redis Database su config/database .php – Sangar82

+2

@ Sangar82, grazie! – ihoru

+0

Per i server heroku redis, è necessario utilizzare la CLI: 'heroku redis: timeout [redis-app-name] --seconds 0 --app [parent-app-name]' –

3

Ho avuto un problema simile, la soluzione migliore per la situazione non è impostare il timeout su 0 ma utilizzando un backoff esponenziale e impostare il limite superiore e inferiore. Anche la modifica del parametro config connection_timeout a 0 risolverà il problema.

Problemi correlati