9

「PHP の致命的なエラー: メッセージ '接続の読み取りエラー' を伴うキャッチされない例外 'RedisException'」

ここのドライバーはphpredisです

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

これは常に ~1 分後にタイムアウトします。私の redis.conf はタイムアウト 0 を言って$redis->getOption(Redis::OPT_READ_TIMEOUT)戻りますdouble(0)

私がこれを行うと、タイムアウトすることはありません$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

なぜ -1 が必要なのですか? Redis のドキュメントにはtimeout 0、redis.conf でタイムアウトしてはいけないと書かれています。

「デフォルトでは、最近のバージョンの Redis は、クライアントが何秒もアイドル状態の場合、クライアントとの接続を閉じません。接続は永久に開いたままになります。」

4

4 に答える 4

12

私が知っている現在の解決策は、2011 年 10 月以来バグがあると報告されている phpredis の永続的な接続を無効にすることです。php-fpm またはその他のスレッド モデルを使用している場合、ライブラリは永続的な接続を明確に無効にします。

php.ini のdefault_socket_timeoutを調整することで、このエラーの頻度を減らすことができる場合があります。

さらに、phpredis の読み取りタイムアウト設定は、広くサポートされているわけではありません。この機能 ( を探すOPT_READ_TIMEOUT) は、タグ 2.2.3 で導入されました

于 2013-08-06T18:14:36.897 に答える
1

コードを php プログラムに追加しましたini_set(‘default_socket_timeout’, -1)が、すぐには機能しないことがわかりました。

しかし、php プログラムを再度実行し始めてから 3 分後、ついに理由がわかりました: redis 接続が永続的ではありません

だから私timeout=0は私の中に設定しredis.conf、問題は解決しました!

于 2014-04-27T09:42:10.467 に答える