PHP の 2 つの拡張モジュールである memcache と memcached の違いについての記事がインターネット上で広く流通しています。この記事では、memcached と memcached の大きな違いは、memcached モジュールが長時間接続をサポートしていないことであると特に強調されています。そのため、私は長年、memcached は長い接続をサポートしていないと考えていましたが、実際にはそうではありません。memcached 拡張モジュールは非常に初期のバージョンから長い接続をサポートしていました。拡張モジュールのソースコードからわかります:
/* {{{ Memcached::__construct([stringpersistent_id[, callback on_new[, string connection_str]]]))
必要に応じて永続的な memcache 接続を使用して、Memcached オブジェクトを作成します */
静的 PHP_METHOD(Memcached, __construct)
{
PHP マニュアルから、memcached 拡張モジュールによって提供されるコンストラクターがオプションのパラメーターpersistent_id
を提供していることがわかります。これはマニュアルで紹介されています:
デフォルトでは、Memcached インスタンスはリクエストの終了後に破棄されます。ただし、作成時にインスタンスごとに一意の ID を指定することで、リクエスト間でインスタンスを共有できます。同じ persistent_id
为每个实例指定唯一的ID, 在请求间共享实例。所有通过相同的persistent_id
値で作成されたすべてのインスタンスは、同じ接続を共有します。
このパラメーターの意味は、名前付き ID をコンストラクターに渡すと、長い接続が確立され、PHP-FPM プロセスが memcached サービス再開に接続されるようにすることです。接続チャネル。また、persistent_id が接続プール名であり、すべての php-fpm プロセスがこの接続プールのメンバーであることもわかります。
ただし、注意する必要があるのは、PHP がインタープリタ型言語であるということです。PHP が初めて memached モジュールを介して長い接続を確立するときは、その後の PHP の実行では、同じpersistent_id 名で長い接続を構築しないように注意してください。 memcached コンストラクターを使用して、異なるpersistent_id 名で長い接続を確立できます。PHP によって同じ名前が繰り返し実行されると、間違いなく php-fpm プロセスが異常になり、memcached との通信が遅くなります。同時に、libmemcached のバージョンに応じて、PHP はコアダンプも生成します。
それでは、persistent_id という名前の長い接続を確立した後、単一の php-fpm が繰り返し長い接続を確立するのを防ぐにはどうすればよいでしょうか?実はPHPのマニュアルにコメント付きで解説されており、その内容は以下の通りです
永続的な接続を使用する場合は、サーバーを再追加しないことが重要です。
これはあなたがしたくないことです:
ページがロードされるたびに、これらのサーバーがリストに追加され、その結果、addServer/addServers 関数は、指定されたサーバーへの既存の参照をチェックしません。
より良いアプローチは次のようなものです:
リーリー
getServerList() メソッドを使用して、現在実行に使用されている php-fpm プロセス コンテナーに同じ名前の長期接続リソースが既に存在するかどうかを確認します。存在する場合は、addServers() メソッドを繰り返し使用して追加しないでください。新しい接続構成。
http://www.bkjia.com/PHPjc/932496.html