2012-08-02 10 views
12

Estoy usando predis y está suscrito a un canal y escuchando, arroja el error y muere, se muestra a continuación, después de 60 segundos exactamente, seguramente no es el error de mi servidor web o su tiempo de espera.Predis está dando 'Error al leer la línea del servidor'

Se está discutiendo un problema similar here. No pude obtener mucho de eso.

Intenté establecer connection_timeout en el archivo predis conf en 0, pero no ayuda mucho.

Además, si sigo usando (enviar datos y procesos) el trabajador no da ningún error. Así que es probable que sea un tiempo de espera en algún lugar, y eso también en conexión.

Aquí está mi fragmento de código, que es probable que produzca un error, porque si se le dan datos al trabajador ejecuta este código y avanza, lo que no produce ningún error después de eso.

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

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

traza

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 

comprobado el tiempo de espera redis.conf también, su también desactivados.

+0

¿Se puede conectar a redis fine usando redis-cli? –

+0

sí, también el trabajador está trabajando bien si se procesan los datos, si se deja durante 60 segundos, se muere y muestra el error – amitchhajer

Respuesta

30

Simplemente configure el parámetro de conexión read_write_timeout en 0 o -1 para solucionarlo. p.ej.

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

El ajuste de los parámetros de conexión es documented in the README. El autor de Redis señaló la importancia del parámetro read_write_timeout a este error en an issue on GitHub, en la que señala que:

Si está usando Predis en un script demonio-como debe establecer read_write_timeout a -1 si quieres deshabilitar completamente el tiempo de espera (este valor funciona con las versiones anteriores y posteriores de Predis). Además, recuerde que debe desactivar el tiempo de espera predeterminado de Redis configurando timeout = 0 en redis.conf o Redis desconectará la conexión de los clientes inactivos después de 300 segundos de inactividad.

+9

Si está utilizando Laravel, agregue 'read_write_timeout' => -1 en Redis Database en config/database .php – Sangar82

+2

@ Sangar82, gracias! – ihoru

+0

Para los servidores heroku redis, debe usar la CLI: 'heroku redis: timeout [redis-app-name] --seconds 0 --app [parent-app-name]' –

3

Tuve un problema similar, una mejor solución a la situación es no establecer el tiempo de espera en 0 pero utilizando un retroceso exponencial y establecer el límite superior e inferior. El cambio en el parámetro de configuración connection_timeout a 0 también resolverá el problema.

Cuestiones relacionadas