PHPメモリキャッシュ機能memcached例


以下では、memcached類の応用例を簡単に紹介します。一定の参考価値があります。興味のある仲間は参考にしてください。
一、memcached概要
多くの場合、私たちはmemcachedという名前を耳にしますが、多くの学生はただ聞いただけで、使ったことがありません。あるいは実際に知ったことがあります。それはいいものだと知っています。ここで簡単に紹介します。memcachedは高効率で高速な分散メモリオブジェクトキャッシュシステムで、主にWEBダイナミックアプリケーションを加速するために使われます。
二、memcachedの取り付け
まずmemcachedをダウンロードしました。現在の最新バージョンは1.1.12です。直接に公式サイトからmemcached-1.1.12.tar.gzにダウンロードできます。それ以外に、memcachedはlibeventを使っています。私はlibevent-1.1 a.tar.gzをダウンロードしました。
次に、それぞれlibevent-1.1 a.tar.gzとmemcached-1.1.12.tar.gzを解凍し、コンパイル、インストールします。
啣ta-xzf libeven-1 a.tar.gz
ヽoo。ツ
ヽoo.configur--prefix=/usr
同前
ヽoo。ツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
ヽ.
ワタルタル-xzf memcache d-1.1.12.tar.gz
ヽoo.cd memcache d-1.1.12
ヽoo.configur--prefix=/usr
同前
ヽoo。ツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
インストールが完了したら、memcachedは/usr/bin/memcachedにあるべきです。
三、memcachedデーモンプログラムを実行する
memcachedデーモンを実行するのは簡単です。コマンドラインだけでいいです。設定ファイルを変更する必要はありません。
/usr/bin/memcached-d-m 128-l 192.168.1.1-p 11211-u httpd
パラメータの説明:
  • -dは、memcachedをデーモン方式で実行する。
  • -mはmemcachedが使用できるメモリサイズを設定し、単位はMです。
  • -lは傍受のIPアドレスを設定し、本機であれば通常このパラメータを設定しなくてもいいです。
  • -pは傍受ポートを設定し、デフォルトは11211ですので、このパラメータを設定しなくてもいいです。
  • -uはユーザを指定していますが、現在rootであれば、このパラメータを使ってユーザを指定する必要があります。
  • もちろん、他のパラメータもあります。マンメムcachedはすぐに見られます。
    四、memcachedの仕事原理
    まず、memcachedは、1つ以上のサーバで、いつでもクライアントの接続操作を受け付けています。クライアントは様々な言語で作成できます。現在知られているクライアントAPIは、Perl/PHP/Python/Ruby/Java/Cなどを含んでいます。PHPなどのクライアントは、memcachedサービスと接続した後、次のことは、アクセス対象となります。アクセス対象ごとに一意の識別子keyがあります。アクセス操作はこのkeyで行います。memcachedに保存されているオブジェクトは実際にメモリに保存されています。cacheファイルに保存されているのではなく、これもなぜmemcachedがこんなに効率的で高速にできるのかという理由である。これらのオブジェクトは永続的ではなく、サービスが停止すると中のデータが失われます。
    五、PHPはどのようにmemcachedクライアントとして使用しますか?
    PHPをmemcachedクライアントとして、memcachedのサービスを呼び出してオブジェクトアクセス操作を行う方法は二つあります。
    一つ目はPHPにmemcacheという拡張があります。Linuxでコンパイルする時はCnable-memcache[=DIR]を持って、Windowではphp.iniからphp_を外します。memcache.dllの前のコメントを使用してください。
    それ以外にも、拡張を避けて、再コンパイルによるトラブルを避ける方法があります。それはphp-memcached-clientをそのまま使うことです。
    本論文は第二の方式を選択して、効率は拡張ライブラリより少し悪いですが、問題は大きくないです。
    六、PHP memcached応用例
    まずmemcached-client.phpをダウンロードして、memcached-client.phpをダウンロードした後に、このファイルの中の種類の“memcached”を通じてmemcachedサービスを操作することができます。実はコードの呼び出しはとても簡単で、主に使う方法はadd()、get()、replace()とdelete()があります。
    
    add ($key, $val, $exp = 0)
    memcachedにオブジェクトを書き込みます。keyはオブジェクトの一意識別子です。valは書き込みの対象データです。expは有効期限が切れています。単位は秒で、デフォルトは時間を制限しません。
    
    get ($key)
    対象データをmemcachedから取得し、オブジェクトの一意識別子$keyで取得する。
    
    replace ($key, $value, $exp=0)
    memcachedの識別子が$keyのオブジェクトコンテンツをvalueで置換します。パラメータはadd()の方法と同じで、keyオブジェクトが存在する場合だけ役立ちます。
    
    delete ($key, $time = 0)
    memcachedの識別子が$keyのオブジェクトを削除します。timeはオプションパラメータです。削除する前にどれぐらい待つべきかを表します。
    以下は簡単なテストコードです。識別子が「mykey」であるオブジェクトデータに対して、コードからアクセス操作を行います。 
    
    <?php 
    //    memcached     
    require_once('memcached-client.php'); 
    //      
    $options = array( 
     'servers' => array('192.168.1.1:11211'), //memcached      、  ,             memcached    
     'debug' => true, //     debug 
     'compress_threshold' => 10240, //               
     'persistant' => false //         
     ); 
    //    memcached      
    $mc = new memcached($options); 
    //               
    $key = 'mykey'; 
    //   memcached       
    $mc->add($key, 'some random strings'); 
    $val = $mc->get($key); 
    echo "n".str_pad('$mc->add() ', 60, '_')."n"; 
    var_dump($val); 
    //             
    $mc->replace($key, array('some'=>'haha', 'array'=>'xxx')); 
    $val = $mc->get($key); 
    echo "n".str_pad('$mc->replace() ', 60, '_')."n"; 
    var_dump($val); 
    //    memcached      
    $mc->delete($key); 
    $val = $mc->get($key); 
    echo "n".str_pad('$mc->delete() ', 60, '_')."n"; 
    var_dump($val); 
    ?>
    
    簡単ではないです。実際のアプリケーションでは、データベースクエリの結果集をmemcachedに保存しています。次回の訪問時に直接memcachedから取得して、データベースクエリ操作をやめて、データベースの負担を大幅に軽減することができます。通常、SQL文md 5()の後の値は一意識別子keyとして使用される。以下は、データベースクエリ結果セットをmemcachedでキャッシュする例である。
    
    <?php 
    $sql = 'SELECT * FROM users'; 
    $key = md5($sql); //memcached       
    { 
     //   memcached          ,             。 
     echo "n".str_pad('Read datas from MySQL.', 60, '_')."n"; 
     $conn = mysql_connect('localhost', 'test', 'test'); 
     mysql_select_db('test'); 
     $result = mysql_query($sql); 
     while ($row = mysql_fetch_object($result)) 
      $datas[] = $row; 
     //                   memcached  ,         。 
     $mc->add($key, $datas); 
    { 
     echo "n".str_pad('Read datas from memcached.', 60, '_')."n"; 
    } 
    var_dump($datas); 
    ?> 
    
    memcachedを使用すると、データベース接続、クエリ操作が減少し、データベース負荷が下がり、シナリオの実行速度が向上したことが分かります。
    以前、「PHPはマルチサーバー共有SESSIONデータを実現する」という記事を書きましたが、記事の中のSESSIONはデータベースを使って保存しています。同時アクセスが大きい時、サーバーの負荷が大きくなり、常にMySQLの最大接続数を超えて、memcachedを利用して、この問題をうまく解決できます。仕事の原理は以下の通りです。
  • ユーザがウェブページを訪問する時、memcachedに現在のユーザーのSESSIONデータがあるかどうかを確認し、session_を使用する。ID()は一意識別子として機能する。データが存在する場合は、直接に戻り、存在しない場合は、データベース接続を行い、SESSIONデータを取得し、このデータをmemcachedに保存して、次回の使用に供する。
  • 現在のPHP運転終了(またはsession_を使用しました。write_close()の場合、My_を呼び出します。Sess::write()方法でデータをデータベースに書き込むと、毎回データベース操作があります。この方法に対しても最適化が必要です。一つのグローバル変数を使って、ユーザーがページに入る時のSESSIONデータを記録し、それをwrite()メソッド内で比較します。このデータは書き込みたいSESSIONデータと同じかどうかは違います。それなら、何の操作もしないで、そのまま帰ってもいいです。
  • ではユーザーSESSIONの期限が切れたらどう解決しますか?memcachedのadd()の方法を覚えていますが、期限切れのパラメータがありますか?このパラメータ値をSESSIONの最大生存時間より小さく設定すればいいです。また、いつもオンラインのユーザーにSESSIONを続ける時間が長いことを忘れないでください。これはwrite()の方法で解決できます。時間を判断することによって、条件に合ったらデータベースデータを更新します。
  • 以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。