2012-08-02 14 views
12

predisを使用していて、チャンネルに登録してリスニングしている場合、60秒間exaxtlyした後、そのタイムアウト。Predisさんが「サーバーから回線を読み取っているときにエラーが発生しました」

同様の問題が議論されていますhereです。それの多くを得ることができませんでした。

私はpredis confファイルのconnection_timeoutを0に設定しようとしましたが、あまり役に立ちません。

また、私はワーカーを使用し続けている(データを送信して処理している)場合、エラーは発生しません。だから、タイムアウトの可能性があります。

これは私のコードスニペットです。これはエラーが発生する可能性があります。ワーカーにデータが渡された場合、このコードが実行され、それ以降はエラーは発生しません。

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

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

トレース

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 

は、そのも無効、あまりにredis.confタイムアウトをチェック。

+0

redis-cliを使用してredis fineに接続できますか? –

+0

はい、データが処理されてもワーカーが正常に動作していますが、60秒間放置するとエラーが発生し、エラーが発生します – amitchhajer

答えて

30

これを修正するには、read_write_timeout接続パラメータを0または-1に設定するだけです。例えば

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

接続パラメータの設定はdocumented in the READMEです。あなたは、デーモンのようなスクリプトでPredisを使用している場合、あなたがしたい場合は、-1read_write_timeoutを設定する必要があり

:Redisのの著者は、彼がいることを指摘しているan issue on GitHubでこのエラーにread_write_timeoutパラメータの関連性を指摘しましたタイムアウトを完全に無効にしてください(この値は古いバージョンと新しいバージョンのPredisで動作します)。また、timeout = 0redis.confに設定すると、Redisのデフォルトタイムアウトを無効にする必要があります。また、300秒間使用しないと、Redisはアイドルクライアントの接続を切断します。

+9

Laravelを使用している場合、config/databaseのRedis Databaseに 'read_write_timeout' => .php – Sangar82

+2

@ Sangar82、ありがとう! – ihoru

+0

heroku redisサーバの場合、 'heroku redis:timeout [redis-app-name] --seconds 0 --app [parent-app-name]' –

3

私は同様の問題を抱えていましたが、タイムアウトを0に設定するのではなく、指数バックオフを使用して上限値と下限値を設定しています。 設定パラメータconnection_timeoutを0に変更しても問題は解決します。