4

PHP プロジェクトで Redis を使用しています。私はクライアントとしてphpredisを使用しています。長い CLI スクリプトを実行しているときに、PHP セグメンテーション エラーが発生することがあります。

接続がタイムアウトしたときにphpredisに問題があることを以前に経験しました。私の Redis 構成は 300 秒後にアイドル状態の接続を自動的に閉じるように構成されているため、セグメンテーション エラーが発生していると思います。

接続タイムアウトを増やすか、デフォルトで 0 (「タイムアウトしない」という意味) にするかを選択できるようにするために、考えられる長所と短所を教えてください。

接続を閉じてはいけないのはなぜですか?
接続が開いたままにならないようにする必要があるのはなぜですか?

ありがとう

4

2 に答える 2

1

一般に、接続を開くことはコストのかかる操作であるため、最新のベスト プラクティスは接続を開いたままにしておくことです。一方、開いている接続は管理するために (データベースからの) リソースを必要とするため、多くのアイドル状態の接続を開いたままにしておくことも問題になる可能性があります。このトレードオフは、通常、接続プールを使用することで解決されます。

とはいえ、さらに興味深いのは、PHP がセグメンテーション違反を起こす理由です。タイムアウトは、明らかに、Redis (主にシングル スレッド) が PHP アプリの接続にアクセスするのをブロックする長時間実行されるコマンド (この場合は CLI スクリプト) によって引き起こされます。これはよく知られている Redis の動作ですが、PHP (クライアント ライブラリでの再接続を特徴としないイベント) がそれほど悲惨なことにならないことを期待しています。

于 2014-05-12T11:13:34.777 に答える
0

あなたの質問への答えは、アプリケーションでの redis の使用状況に大きく依存します。では、アイドル接続タイムアウトで接続を閉じてはいけませんか?

通常は noです。デフォルトの 0 のままにしておく必要があります。理由または時期:

  • あらゆるタイプの長寿命アプリケーション。バックグラウンド ワーカーの CLI スクリプトなど。理由 - phpredis には再接続機能が組み込まれていないため、自分でこれを処理するか、アイドル タイムアウトを行わないようにする必要があります。
  • リクエストが処理されるか、CLI スクリプトが終了するたびに、すべての接続が php エンジンによって閉じられます。Redis サーバーは、閉じられたクライアント ソケットのすべての接続を閉じます。ゾンビ接続などの問題はありません。拡張機能として、phpredis はデストラクタで接続を閉じます。そのため、接続が開いたままにならない可能性があります。

ps もちろん、php の一部のプロキシ クラスに再接続を自分で実装することもできます。高負荷環境で redis を使用しています - インスタンスで 1 秒あたり最大 4000 接続。バージョン 2.4 以降では、アイドル接続タイムアウトを使用しません。そして、それに関してどんな種類のトラブルもありません。

于 2014-05-09T17:05:13.280 に答える