24

私はpredisを使用しています、それはチャンネルにサブスクライブして聞いています。次のエラー(下記)をスローし、正確に60秒後に終了します。それは確かに私のウェブサーバーのエラーやそのタイムアウトではありません。

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

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のタイムアウトもチェックしました。これも無効になっています。

4

5 に答える 5

42

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

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

接続パラメータの設定については、READMEに記載されています。Redisの作成者は、GitHubの問題で、read_write_timeoutこのエラーとパラメーターの関連性を指摘しました。

デーモンのようなスクリプトでPredisを使用している場合、タイムアウトを完全に無効にする場合に設定read_write_timeoutする必要があります(この値は、Predisの古いバージョンと新しいバージョンで機能します)。また、 redis.confで設定して-1Redisのデフォルトのタイムアウトを無効にする必要があることに注意してください。無効にしないと、Redisは300秒間非アクティブになるとアイドル状態のクライアントの接続を切断します。timeout = 0

于 2012-08-13T09:39:14.367 に答える
4

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

于 2012-09-04T20:07:21.780 に答える
1

私は問題の解決策を得ました。そのため、アプリケーションサーバーが別のマシン上の特定のアプリケーションに接続できるポートには制限があります。これらのポートは使い果たされていました。制限を増やして問題を解決しました。

この問題についてどうやって知りましたか?PHPでは、ソケットの作成中に「要求されたアドレスを割り当てることができません」というエラーが発生していました(エラーコード99)。

于 2018-06-07T12:03:04.640 に答える
0

/etc/redis/redis.conf

timeout = 0 
于 2020-09-25T15:22:25.597 に答える
0

私はHerokuを使用しており、RedisHerokuからRedisEnterpriseアドオンに切り替えて、この問題を解決まし

use Predis\Client as PredisClient;

GuzzleHttp\Clientとの衝突を解決します。あなたは去ることができます

PredisClientとして

GuzzleHttpを使用していない場合は行。

そして接続:

$redisClient = new PredisClient(array(
     'host' => parse_url(env('REDIS_URL'), PHP_URL_HOST),
     'port' => parse_url(env('REDIS_URL'), PHP_URL_PORT),
     'password' => parse_url(env('REDIS_URL'), PHP_URL_PASS)
)

);

(「REDIS_URL」はHeroku構成変数に自動的に事前入力されています)。

于 2021-12-09T10:40:24.183 に答える