Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


16.6.3.6 PHP での MySQL と memcached の使用

PHP は、PECL 拡張によって Memcache 関数のサポートを提供します。PHP の memcache 拡張を有効にするには、PHP をソースからビルドするときに configure--enable-memcache オプションを指定してビルドします。

Red Hat ベースのサーバーをインストールする場合は、php-pecl-memcache RPM をインストールできます。

root-shell> yum --install php-pecl-memcache

Debian ベースの配布では、php-memcache パッケージを使用します。

グローバル実行時構成オプションを設定するには、php.ini ファイル内に構成オプションの値を指定します。次の表に、個々のグローバル実行時構成オプションの名前、デフォルト値、および説明を示します。

構成オプション デフォルト 説明
memcache.allow_failover 1 最初に選択したサーバーに障害が発生した場合にリスト内の別のサーバーをクエリーするかどうか指定します。
memcache.max_failover_attempts 20 失敗を返す前に試行するサーバーの数を指定します。
memcache.chunk_size 8192 memcached サーバーとのデータ交換に使用するネットワークチャンクのサイズを定義します。
memcache.default_port 11211 memcached サーバーとの通信時に使用するデフォルトポートを定義します。
memcache.hash_strategy standard 使用するハッシュ方式を指定します。consistent に設定すると、キーをほかのサーバーに再マップしないで、サーバーをプールに追加したりプールから削除したりできるようになります。standard に設定すると、格納時に別のサーバーを使用する可能性がある古い (モジュラ) 方式が使用されます。
memcache.hash_function crc32 キーをサーバーにマップするときに使用する関数を指定します。crc32 にすると、標準の CRC32 ハッシュが使用されます。fnv にすると、FNV-1a ハッシュ化アルゴリズムが使用されます。

memcached サーバーへの接続を作成するには、新しい Memcache オブジェクトを作成してから、接続オプションを指定します。例:

<?php

$cache = new Memcache;
$cache->connect('localhost',11211);
?>

これにより、指定したサーバーへの接続がただちに開きます。

複数の memcached サーバーを使用するには、addServer() を使用して memcache オブジェクトにサーバーを追加する必要があります。

bool Memcache::addServer ( string $host [, int $port [, bool $persistent
                 [, int $weight [, int $timeout [, int $retry_interval
                 [, bool $status [, callback $failure_callback
                 ]]]]]]] )

php-memcache モジュール内のサーバー管理メカニズムは、このインタフェースの重要な部分であり、memcached インスタンスへのメインインタフェースとハッシュ化メカニズムによるインスタンスの選択方法を制御します。

2 つの memcached インスタンスへの単純な接続を作成するには:

<?php

$cache = new Memcache;
$cache->addServer('192.168.0.100',11211);
$cache->addServer('192.168.0.101',11211);
?>

このシナリオでは、インスタンス接続は明示的に開かれず、値を格納または取得しようとしたときにのみ開かれます。memcached インスタンスへの永続的な接続を有効にするには、$persistent 引数を true に設定します。これはデフォルト設定であり、これによって接続が開いたままになります。

別のインスタンスへのキー分布を制御するには、memcache.hash_strategy グローバル設定を使用します。これは、選択に使用されるハッシュ化メカニズムを設定します。各サーバーに別の重みを追加することもできます。この重みは、インスタンスエントリがインスタンスリストに現れる回数を効果的に増やすことによって、ほかのインスタンスよりもそのインスタンスが選択される可能性を増やします。この重みを設定するには、$weight 引数を 1 より大きい値に設定します。

情報を設定および取得する関数は、このテーブルに示すように、memcached に用意されている汎用関数インタフェースと同等です。

PECL の memcache 関数 汎用関数
get() 汎用の get()
set() 汎用の set()
add() 汎用の add()
replace() 汎用の replace()
delete() 汎用の delete()
increment() 汎用の incr()
decrement() 汎用の decr()

PECL の memcache インタフェースの完全な例を次に示します。このコードは、ユーザーが映画名を指定したときに、Sakila データベースから映画のデータをロードします。memcached インスタンスに格納されているデータは mysqli の結果行として記録され、この情報は API によって自動的に直列化されます。

<?php

$memc = new Memcache;
$memc->addServer('localhost','11211');

if(empty($_POST['film'])) {
?>
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Simple Memcache Lookup</title>
    </head>
    <body>
      <form method="post">
        <p><b>Film</b>: <input type="text" size="20" name="film"></p>
        <input type="submit">
      </form>
      <hr/>
<?php

} else {
    
    echo "Loading data...\n";
    
    $film   = htmlspecialchars($_POST['film'], ENT_QUOTES, 'UTF-8');
    $mfilms = $memc->get($film);

    if ($mfilms) {

        printf("<p>Film data for %s loaded from memcache</p>", $mfilms['title']);

        foreach (array_keys($mfilms) as $key) {
            printf("<p><b>%s</b>: %s</p>", $key, $mfilms[$key]);
        }

    } else {

        $mysqli = mysqli('localhost','sakila','password','sakila');
    
        if (mysqli_connect_error()) {
            sprintf("Database error: (%d) %s", mysqli_connect_errno(), mysqli_connect_error());
            exit;
        }
    
        $sql = sprintf('SELECT * FROM film WHERE title="%s"', $mysqli->real_escape_string($film));

        $result = $mysqli->query($sql);

        if (!$result) {
            sprintf("Database error: (%d) %s", $mysqli->errno, $mysqli->error);
            exit;
        }

        $row = $result->fetch_assoc();

        $memc->set($row['title'], $row);

        printf("<p>Loaded (%s) from MySQL</p>", htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
    }
}
?>
  </body>
</html>

PHP では、PHP と関連する Apache インスタンスの実行が継続するかぎり、memcached インスタンスへの接続は開いたまま維持されます。実行中のインスタンスでサーバーをリストに追加したり、リストから削除したりすると (たとえば、追加のサーバーが指定された別のスクリプトを起動したときなど)、接続は共有されますが、スクリプト内で明示的に構成されたインスタンスのみが選択されます。

スクリプト内でサーバーリストに変更を加えることによって問題が発生しないようにするには、必ず整合ハッシュ化メカニズムを使用してください。