PHP memcached応用例


PHPはどのようにmemcachedクライアントとして
PHPをmemcachedクライアントとしてmemcachedのサービスを呼び出してオブジェクトアクセス操作を行うには、2つの方法があります.
第一に、PHPにはmemcacheという拡張があり、Linuxでコンパイルする際に–enable-memcache[=DIR]オプションを持参する必要があり、Windowではphp.iniからphp_を取り除くmemcache.dllの前のコメントを使用可能にします.
それ以外に、php-memcached-clientを直接使用することで、拡張、再コンパイルによるトラブルを避ける方法もあります.
この文書では、拡張ライブラリよりも効率がやや悪いが、問題は大きくない第2の方法を選択します.
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」のオブジェクトデータへのアクセス操作を行う簡単なテストコードを次に示します.

<pre>
<?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);
?>
</pre>

簡単ではありませんが、実際のアプリケーションでは、通常、データベース・クエリーの結果セットをmemcachedに保存し、次回のアクセス時に直接memcachedから取得し、データベース・クエリー操作を行わないようにすることで、データベースの負担を大幅に軽減できます.通常、SQL文md 5()以降の値は一意の識別子keyとして使用されます.下はmemcachedを使用してデータベース・クエリーの結果セットをキャッシュする例です(このコード・クリップのすぐ上のサンプル・コード).

<?php
$sql
= ‘SELECT * FROM users’;
$key = md5($sql);   //memcached
if ( !($datas = $mc->get($key)) ) {
    
//   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);
} else {
     echo
“n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).“n”;
}
var_dump($datas);
?>

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最大生存時間より小さく設定すればよい.また、常にオンラインのユーザーにSESSIONを継続する時間を与えることを忘れないでください.これはwrite()メソッドで解決でき、時間を判断することで、条件を満たすとデータベースデータを更新します.