ホームページ  >  記事  >  バックエンド開発  >  PHP メモリ キャッシュ memcached モジュールのインストールと使用法

PHP メモリ キャッシュ memcached モジュールのインストールと使用法

WBOY
WBOYオリジナル
2016-07-25 08:52:43815ブラウズ
  1. # tar -xzf libevent-1.1a.tar.gz
  2. # cd libevent-1.1a
  3. # ./configure --prefix=/usr
  4. # make
  5. # make install
  6. # cd ..
  7. # tar -xzf memcached-1.1.12.tar.gz
  8. # cd memcached-1.1.12
  9. # ./configure --prefix=/usr
  10. # make
  11. # make install
复制代

インストールが完了すると、memcached は /usr/bin/memcached にあるはずです。 3. memcached デーモンを実行します。 memcached デーモンの実行は非常に簡単です。コマンド ラインを必要とするだけです (変更する必要がある構成ファイルはありません)。 d -m 128 -l 192.168.1.1 -p 11211 -u httpd パラメータの説明: -d はデーモン モードで memcached を実行します。 -m は、memcached が使用できるメモリ サイズを M 単位で設定します。 -l は、監視 IP アドレスを設定します。ローカル マシンの場合、通常、このパラメータを設定する必要はありません。 -p はリスニング ポートを設定します。デフォルトは 11211 であるため、このパラメータを設定する必要はありません。 -u はユーザーを指定します。現在 root である場合は、このパラメーターを使用してユーザーを指定する必要があります。もちろん、man memcached を実行すると、他にも使用できるパラメーターが表示されます。

3. memcached の動作原理: まず、memcached は 1 つ以上のサーバーでデーモンとして実行され、クライアント接続操作をいつでも受け入れます。現在知られているクライアント API には、Perl/PHP /Python/Ruby などがあります。 /Java/C#/C などPHP などのクライアントが memcached サービスとの接続を確立したら、次にアクセスするオブジェクトには一意の識別子キーがあり、アクセス操作は memcached に保存されます。 、キャッシュ ファイルに保存されないため、memcached は非常に効率的かつ高速になります。

これらのオブジェクトは永続的ではないため、サービスが停止されると内部のデータが失われることに注意してください。

4. PHP を memcached クライアントとして使用するには 2 つの方法があります。

PHP を memcached クライアントとして使用して、オブジェクト アクセス操作のために memcached サービスを呼び出すことができます。

まず、PHP には memcache という拡張機能があります。Linux でコンパイルする場合、Windows では、php.ini の php_memcache.dll の前のコメントを削除する必要があります。 。 また、展開や再コンパイルによるトラブルを回避するには、php-memcached-client を直接使用する方法もあります。

この記事では2番目の方法を使用しますが、拡張ライブラリよりも若干効率は悪くなりますが、大きな問題はありません。 4. PHP memcached アプリケーションの例 まず、memcached-client.php をダウンロードします。ダウンロード後、このファイル内のクラス「memcached」を通じて memcached サービスを操作できます。実際、コード呼び出しは非常に単純です。使用される主なメソッドは、add()、get()、replace()、および delete() です。メソッドの説明は次のとおりです。 ) オブジェクトを memcached に書き込みます。$key はオブジェクトの一意の識別子です。$exp は秒単位の有効期限です。 オブジェクトの一意の識別子 $key replace ($key, $value, $exp=0) を通じて memcached からオブジェクト データを取得します。 $value を使用して、memcached の識別子 $key に置き換えます。パラメーターは、$key オブジェクトが存在する場合にのみ機能します ($key, $time = 0)。 memcached 内の識別子 $key を持つオブジェクトを削除します。 $time は、削除するまでの待機時間を示すオプションのパラメーターです。

以下は、識別子「mykey」を持つオブジェクト データにアクセスする簡単なテスト コードです。

  1. // memcached クラス ファイルが含まれます
  2. require_once('memcached-client.php');
  3. // オプション設定
  4. $options = array(
  5. 'servers' => array('192.168.1.1:11211 '), //memcached サービスのアドレスとポート、複数の配列要素を使用して複数の memcached サービスを表すことができます
  6. 'debug' => true, //デバッグがオンかどうか
  7. 'compress_threshold' => 10240, //単語数を超えている セクション内のデータを圧縮します
  8. 'persistant' => false //永続的な接続を使用するかどうか
  9. ); memcached オブジェクトのインスタンスを作成します
  10. $mc = new memcached($options);このスクリプトで使用される一意の値を設定します 識別子
  11. $key = 'mykey'
  12. // memcached にオブジェクトを書き込みます
  13. $mc->add($key, 'some Random strings');
  14. $val = $mc-> ;get($key );
  15. echo "n".str_pad('$mc->add() ', 60, '_')."n";
  16. var_dump($val);オブジェクトデータ値
  17. $mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
  18. $val = $mc->get($ key);
  19. echo "n".str_pad('$mc->replace() ', 60, '_')."n";
  20. var_dump($val); ->delete($key);
  21. $val = $mc->get($key);
  22. echo "n".str_pad('$mc->delete() ', 60, '_')。 "n ";
  23. var_dump($val)
  24. ?>
  25. コードをコピーします
  26. 実際のアプリケーションでは、データベース クエリの結果セットは通常 memcached に保存され、次回アクセスするときにデータベース クエリ操作を実行する代わりに memcached から直接取得されます。これにより、データベースへの負担を大幅に軽減できます。かなりの程度。通常、SQL ステートメント md5() の後の値が一意の識別子のキーとして使用されます。

    以下は、memcached を使用してデータベース クエリ結果セットをキャッシュする例です (このコード スニペットは上記のサンプル コードに従っています)。

      $sql = 'SELECT * FROM users';
    1. $key = md5($sql); //memcached オブジェクト識別子
    2. {
    3. // キャッシュされたデータが memcached で取得されない場合は、データベース クエリを使用します。レコードセット。
    4. echo "n".str_pad('MySQL からデータを読み取ります。', 60, '_')."n" = mysql_connect('localhost', 'test', 'test'); test');
    5. $result = mysql_query($sql);
    6. while ($row = mysql_fetch_object($result))
    7. $datas[] = $row
    8. // データベースから取得した結果セットのデータを memcached に保存します。次回の訪問のために。
    9. $mc->add($key, $datas);
    10. {
    11. echo "n".str_pad('memcached からデータを読み取ります。', 60, '_')."n";
    12. }
    13. var_dump($) datas);
    14. ?>
    15. コードをコピー
    memcached を使用すると、データベース接続とクエリ操作が削減され、データベースの負荷が軽減され、スクリプトの実行速度も向上することがわかります。 。以前「PHP は SESSION データのマルチサーバー共有を実装する」という記事を書きました。その記事内の SESSION は、同時アクセス数が多いと、サーバーの負荷が非常に大きくなります。 MySQL の最大接続数を超えている場合、memcached を使用すると、この問題をうまく解決できます。原理は次のとおりです。 ユーザーが Web ページにアクセスすると、memcached に現在のユーザーの SESSION データがあるかどうかを確認し、データが存在する場合は session_id() を一意の識別子として使用します。データが存在しない場合は、直接接続します。データベースに再度アクセスし、SESSION データを取得し、次回使用するためにこのデータを memcached に保存します。 現在の PHP 操作が終了する (または session_write_close() が使用される) と、My_Sess::write() メソッドが呼び出され、データベースにデータが書き込まれます。この場合も、このメソッドは毎回データベース操作を実行します。最適化する必要があります。ユーザーがページに入ったときにグローバル変数を使用して SESSION データを記録し、このデータを write() メソッドで比較して、書き込みたい SESSION データと同じかどうかを確認します。異なる場合は、に接続します。データベースに書き込み、同時に memcached 内の対応するデータを追加します。それらが同じであれば、SESSION データは変更されていないことを意味するため、何もせずに直接戻ることができます。操作 それでは、ユーザーの SESSION 有効期限を解決するにはどうすればよいでしょうか? memcached の add() メソッドには有効期限パラメータ $exp があることを覚えていますか?このパラメータ値を SESSION の最大生存時間未満に設定するだけです。また、常にオンラインのユーザーの場合は、条件が満たされた場合にデータベースのデータが更新されるように、write() メソッドで解決できます。

    php memcached クライアント memcached

    memcache をインストールしたときに、memcached クライアントは memcache と呼ばれると言いましたが、実際には、libmemcached をベースにした memcached というクライアントがあり、よりパフォーマンスが良く、より多くの機能があると言われています。

    memcache の公式ホームページ: http://pecl.php.net/package/memcache Memcached の公式ホームページ: http://pecl.php.net/package/memcached

    以下は、Memcached バージョンの PHP モジュールをインストールするプロセスの記録です。

    $mem = 新しい Memcache;

    $mem->addServer($memcachehost, '11211'); $mem->set('hx','9enjoy');
      echo $mem->get('hx');

    1. $md = 新しい Memcached

    2. $servers = array(
    3. array($memcachehost, '11211'),
    4. array($memcachehost, '11212')
    5. );
    6. $md->addServers($servers); '9enjoy');
    7. echo $md->get('hx');

    8. コードをコピー
    9. memcached には、getMulti、getByKey、addServers など、memcache よりも多くのメソッドがあります。 Memcached には memcache の connect メソッドがなく、現時点では長時間の接続はサポートされていません。 Memcached はバイナリ プロトコルをサポートしていますが、memcache はサポートしていません。つまり、memcached の方がパフォーマンスが高くなります。 Memcache はネイティブに実装されており、OO インターフェイスと非 OO インターフェイスの両方の共存をサポートします。Memcached は libmemcached を使用し、OO インターフェイスのみをサポートします。 詳しい違い: http://code.google.com/p/memcached/wiki/PHPClientComparison

      memcached サーバーは集中型キャッシュ システムであり、分散実装方法はクライアントによって決定されます。 memcached の分散アルゴリズムには通常 2 つのオプションがあります。 1. hash(key) の結果に従って、モジュラー接続番号の残りの部分、つまり hash(key)% session.size() が決定されます。このアルゴリズムはシンプルで高速であり、パフォーマンスも良好です。ただし、このアルゴリズムには欠点があり、memcached ノードを追加または削除すると、元のキャッシュ データが大規模に無効になり、ノードやキャッシュ データが多数ある場合、ヒット率に大きな影響を与えます。キャッシュを再構築するコストが高すぎるため、2 番目のアルゴリズムを使用します。 2. Consistent Hashing、一貫したハッシュアルゴリズム、そのノード検索プロセスは次のとおりです:

      まず、memcached サーバー (ノード) のハッシュ値を見つけて、0 から 232 までのサークル (連続体) 上に設定します。次に、同じ方法を使用して、データを保存しているキーのハッシュ値を見つけ、それをサークルにマッピングします。次に、データがマッピングされている場所から時計回りに検索し、最初に見つかったサーバーにデータを保存します。 2 の 32 乗を超えてもサーバーが見つからない場合は、最初の memcached サーバーに保存されます。

      Memcache は、構成を行わずに最初の方法を使用します。最初のメソッドを実装するために、memcached は次のものを使用するようです (未確認)。 $md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

      2 番目のコンシステント ハッシュ アルゴリズム: memcacheはphp.iniに追加されます

      Memcache.hash_strategy =一貫性のある Memcache.hash_function =crc32

      memcached がプログラムに追加されました (未確認)

      $md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); $md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC); または $mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT); $mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。