すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for Memcache:PHP の持続的接続を使用したパフォーマンスの向上

最終更新日:Aug 25, 2026

問題の説明

一部の PHP ユーザーから、ApsaraDB for Memcache で実施したパフォーマンステストの結果が、期待していたパフォーマンスメトリクスに達しないという報告があります。こうしたケースの多くでは、アプリケーションは Apache Web サービス経由で ApsaraDB for Memcache にアクセスし、短命な接続を使用しています。短命な接続は、複雑な再認証手順も実行するため、ソケットの再接続よりもコストが高くなります。このコストは通常のリクエストのコストよりもはるかに高いため、Web サイトの効率を大幅に低下させます。

ソリューション

そのため、短命な接続を持続的接続に置き換えることを推奨します。ただし、ApsaraDB for Memcache では PHP Memcached 拡張が必要です。PHP Memcached 拡張は memcache 拡張とは異なり、pconnect インターフェイスを提供しません。以下の手順では、PHP で持続的接続を設定する方法を示します。

PHP Memcached documentation より:

Description
Memcached::__construct ([ string $persistent_id ] ) Creates a Memcached instance representing the connection to the memcache servers.

Parameters
persistent_id By default the Memcached instances are destroyed at the end of the request. To create an instance that persists between requests, use persistent_id to specify a unique ID for the instance. All instances created with the same persistent_id will share the same connection.

つまり、コンストラクターに同じ persistent_id を渡すことで接続を共有します。コードは次のとおりです:

<?php
 $memc = new Memcached('ocs'); // ここでの 'ocs' は persistent_id です
if (count($memc->getServerList()) == 0) /* 接続を確立する前に確認します */
{
  echo "New connection"."<br>";

/* 一部のオプションは再接続を引き起こし、持続的接続を短命な接続に変えてしまうため、すべてのオプションをこの条件文内に記述してください。 */
  $memc->setOption(Memcached::OPT_COMPRESSION, false);
  $memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
  $memc->setOption(Memcached::OPT_TCP_NODELAY, true); // 重要: PHP Memcached には、取得しようとした値が存在しない場合に 40 ms の固定遅延が発生するバグがあります。このオプションを有効にして、このバグを回避します。

  /* addServer のコードもこの条件文内に記述する必要があります。そうしないと、'ocs' コネクションプールが再構築され、PHP クライアント側で例外が発生する可能性があります。 */
  $memc->addServer("your_ip", 11212);
  $memc->setSaslAuthData("user", "password");
}
else
{
  echo "Now connections is:".count($memc->getServerList())."<br>";
}
$memc->set("key", "value");
echo "Get from OCS: ".$memc->get("key");
//$memc->quit(); /* コードの末尾に quit を追加しないでください。追加すると接続が短命になります。 */
?>

上記のコードで注意が必要な 3 つのポイントは、すべてコメントで示しています。コンストラクター内の ocs キーワードはコネクションプールとして機能します。接続が必要になった場合は、new Memcached('ocs') を呼び出してプールから接続を 1 つ取得します。

結果

上記のコードを Apache の作業ディレクトリ /var/www/html/ に配置し、test.php という名前を付けてから、ブラウザーで http://your_ip:80/test.php にアクセスします。最初の 8 回のリクエストでは、ブラウザーに次の出力が表示されます:

New connection
Get from OCS: value

つまり、最初の 8 回の各リクエストで新しい接続が作成され、それ以降のすべてのリクエストでは 8 本の接続のいずれかが再利用されます。パケットキャプチャでも、9 回目以降のすべてのトラフィックで持続的接続が使用されており、ソケットの再接続も認証も行われていないことが確認できます。

なぜ接続が 8 本なのでしょうか。httpd.conf 設定ファイルを見ると、Apache が 8 つの子プロセスを起動していることがわかります:

#StartServers: 起動するサーバープロセス数
 StartServers        8

このため、ocs persistent_id の接続プールは正確に 8 つの接続を初期化し、以降のすべてのリクエストでこの 8 つの接続が使用されます。

次に、ページ遷移をテストします。PHP ファイルをコピーし、接続を確立するコンストラクターでは persistent_id として引き続き ocs を使用します。リクエストは別の Apache 子プロセスによって処理されるため、プール内の異なる接続が使用されますが、認証もソケットの再接続も発生しません。これにより、PHP Memcached の持続的接続設定が機能していることが確認できます。通常は PHP-FPM モードを使用します。FPM プロセスは Memcached サーバーに対して持続的接続を維持するため、この接続のライフサイクルは Apache プロセスのライフサイクルと同じになります。