PHPでRedisの長い接続を使用する手順は何ですか

php中世界最好的语言
リリース: 2023-03-26 16:38:02
オリジナル
2648 人が閲覧しました

今回は、PHP で Redis ロング接続を使用する手順と、PHP で Redis ロング接続を使用する際の 注意事項 を​​紹介します。以下は実際的なケースです。一緒に見てみましょう。

github の php-redis プロジェクト アドレス: https://github.com/phpredis/phpredis

pconnect 関数宣言

ここで、 time_out は、クライアントが切断されるまでにアイドル状態になる秒数を示します。関数 connection は、成功した場合は true を返し、失敗した場合は false を返します。

pconnect(host, port, time_out, persistent_id, retry_interval)
    host: string. can be a host, or the path to a unix domain socket
    port: int, optional
    timeout: float, value in seconds (optional, default is 0 meaning unlimited)
    persistent_id: string. identity for the requested persistent connection
    retry_interval: int, value in milliseconds (optional)
ログイン後にコピー
次の例では、pconnect 接続の再利用について詳しく説明します。

$redis->pconnect('127.0.0.1', 6379);
$redis->pconnect('127.0.0.1'); // 默认端口6379,跟上面的例子使用相同的连接。
$redis->pconnect('127.0.0.1', 6379, 2.5); // 设置了2.5秒的过期时间。将是不同于上面的新连接
$redis->pconnect('127.0.0.1', 6379, 2.5, 'x'); //设置了持久连接的id,将是不同于上面的新连接
$redis->pconnect('/tmp/redis.sock'); // unix domain socket - would be another connection than the four before.
ログイン後にコピー

pconnectの使い方の紹介

pconnectメソッドの簡単な説明

このメソッドを使用して接続を作成します。closeメソッドを呼び出した後、接続は閉じられません。プロセスが終了すると閉じられます。

[要確認] 長い接続を使用している場合、Redis設定ファイルのタイムアウト設定項目を0に設定する必要があります。そうしないと、接続プール内の接続がタイムアウトにより期限切れになります

PHP-FPM の説明 pconnect

長い接続は、PHP-FPM プロセスが終了した後にのみ終了します。接続の

ライフサイクルは、PHP-FPM プロセスのライフサイクルです。 短い接続と比較すると、各 PHP-FPM 呼び出し中に Redis 接続が生成され、サーバー上の表現は過剰な time_out 接続ステータスになります。
長い接続とは対照的に、PHP-FPM によって呼び出されるすべての CGI は 1 つの長い接続のみを共有するため、固定数の time_out のみが生成されます。

長い接続を閉じます

close メソッドと unset メソッドを呼び出すことができますが、この 2 つのメソッドは大きく異なります:

-

close の機能は、現在の PHP プロセスが Redis リクエストを行うのを防ぐことだけですが、 Redis の長い接続を実際に閉じることはできません。FPM プロセスのライフサイクルが終了するまで、接続は後続のリクエストで再利用されます。したがって、close は Redis オブジェクトを破壊するのではなく、単に切断するだけです。

-

unset 変数は破棄されます。また、pconnect を使用する場合、現在のスクリプトの実行時間が非常に長い場合は、常に接続を占有するため、閉じる必要がないことにも注意してください。

現在の Redis が接続状態かどうかを判断する方法

同等の問題は、現在のインスタンスが

シングル ケース モード で有効であるかどうかを判断することです。

文字列自体が正常に返されるかどうかを確認するにはechoを呼び出すか、戻り値が+PONGであるかどうかを確認するにはpingを呼び出すのが一般的です。

ただし、redis が切断された後、echo と ping を呼び出すと (「+POMG」を返す)、例外がスローされます

。したがって、例外をキャッチするメカニズムを通じて処理する必要があります。

pconnect 接続の再利用問題のコード分析

状況 1: 非シングルトン モード。

説明: インスタンス a とインスタンス b は接続を共有し、インスタンス b はインスタンス a の接続を変更します:

したがって、次の例ではインスタンス $a の最終値が 2 になるため、特別な注意が必要です。

$a = pconnect(host, port, time_out);
select(3);
$a -> setex(id, 3);
echo $a -> get(id);
//之后执行下面的连接
$b = pconnect(host, port, time_out);
select(2);
$b->set(id,2)
echo $a->get(id);  //这个id操作的db变成了2,不再是之前的3了。因为这两个连接共用了一个连接通道。
ログイン後にコピー

シナリオ 2: シングルトン モード。

a と b の両方が getInstance を通じて生成されるように、上記のコードを変更します。生成の前提条件は、現在のインスタンスが存在するかどうかを確認することです。シングルトン モードの混乱点は次のとおりです。

$a はインスタンスを生成します。このとき、$b は $a のインスタンスを使用し、その後の $a への呼び出しを変更します。変更後の例は $b の呼び出しである必要があります。状況 2 と同じ。

シングルトン モードのコードは次のとおりです:

public static function getInstance($db = 0)
{
  if (!isset(self::$_instance)) {
    self::$_instance = new Redis();
  }
  self::_connect();
  self::$_instance->select($db);
  return self::$_instance;
}
ログイン後にコピー

どちらの場合も接続の再利用の問題を示しています。このバグを修正するにはどうすればよいですか? 2 つのポイント:

1. データベースごとに 1 つのインスタンスを生成します。

2. 接続の再利用の問題を回避します。


そのため、シングルトン配列を返すようにコードを調整できます:

public static function getInstance($db = 0)
{
  try{
    if (isset(self::$_instance[$db]) && self::$_instance[$db]->Ping() == 'Pong') {
      return self::$_instance[$db];
    }
  } catch (Exception $e) {
  }
  self::$_instance[$db] = new Redis();
  self::_connect($db);
  return self::$_instance[$db];
}
ログイン後にコピー

注意事項Task クラスのメンバー変数で Redis オブジェクトを使用しないでください。

redisのシングルトンモードではtime_outの有効期限が宣言されています。 Redis 処理の機会がタスクであり、タスクから Redis を呼び出す間隔が比較的長い場合。間隔が time_out より大きい場合、redis は切断され、redis 上のすべての操作は失敗します。解決策は、この呼び出しメソッドを回避し、呼び出し場所で redis クラスを動的に宣言することでメソッドを実行することです。この種の問題は、長い接続と短いリンクを区別せず、呼び出しメソッドのエラーです。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

php+mysql は広告クリック統計を実装します (コード付き)

PHP 中国語ツール クラス ChineseUtil は中国語の文字とピンインをどのように変換しますか

以上がPHPでRedisの長い接続を使用する手順は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート