ホームページ > php教程 > php手册 > PHP Memcached アプリケーションの実装コード

PHP Memcached アプリケーションの実装コード

WBOY
リリース: 2016-06-13 12:19:24
オリジナル
815 人が閲覧しました

肖理达 (KrazyNio AT hotmail.com), 2006.04. 06, 转载请注明出处

一、memcached 简介

在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。

二、memcached 安装

首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz

接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:

复制代码 代码如下:


# tar -xzf libevent-1.1a.tar.gz
# cd libevent-1.1a
# ./configure --prefix=/usr
# make
# make install
# cd ..
# tar -xzf memcached-1.1.12.tar.gz
# cd memcached-1.1.12
# ./configure --prefix=/usr
# make
# make install


安装完成之后,memcached 应该在 /usr/bin/memcached。

三、运行 memcached 守护程序

运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改 ):

/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd参数解释:

-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。
当然,还有其它参数可以用,man memcached 一下就可以看到了。

四、memcached 的工作原理

首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

三、PHP 如何作为 memcached 客户端

有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。

第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-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)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;

delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。

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

コードをコピーします コードは次のとおりです:


// memcached クラス ファイルが含まれます
require_once('memcached-client.php');
// オプション設定
$options = array(
'servers' => array('192.168.1.1:11211'), //memcached サービスのアドレスとポートを使用して、複数の memcached サービスを表すことができます。
'debug' => , //デバッグをオンにするかどうか
'compress_threshold' => 10240, //データがバイト数を超えた場合に圧縮する
'persistant' => false //永続的な接続を使用するかどうか
);
// memcached オブジェクトのインスタンスを作成します
$mc = new memcached($options);
// このスクリプトで使用される一意の識別子を設定します
$key = 'mykey'>//オブジェクトを memcached に書き込みます
$mc->add($key, 'いくつかのランダムな文字列');
$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 ステートメント md5() の後の値が一意の識別子のキーとして使用されます。以下は、memcached を使用してデータベース クエリ結果セットをキャッシュする例です (このコード スニペットは上記のサンプル コードに従っています):


コードをコピーします

コードは次のとおりです。以下のように: $sql = 'SELECT * FROM users';

$key = md5($sql); //memcached オブジェクト識別子

if ( !($ datas = $mc->get($key)) ) {
// memcached でキャッシュされたデータが取得できない場合は、データベース クエリを使用してレコード セットを取得します。
echo "n".str_pad('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('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 の最大生存時間未満に設定するだけです。また、常にオンラインのユーザーの場合は、条件が満たされた場合にデータベースのデータが更新されるように、write() メソッドで解決できます。
  • 5. 関連リソース

memcached 公式ウェブサイト

    PHP memcached クライアント
  • memcached-client.php をダウンロード
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート