ホームページ  >  記事  >  バックエンド開発  >  PHP メモリ キャッシュ関数 memcached example_php の例

PHP メモリ キャッシュ関数 memcached example_php の例

WBOY
WBOYオリジナル
2016-12-05 13:28:141367ブラウズ

以下に memcached クラスの応用例を簡単に紹介しますので、興味のある方は参考にしてください。

1. memcached の概要

memcached という名前をよく聞くことがありますが、多くの学生は聞いたことがあるだけで、実際には使用したことがなく、それが非常に良いものであることしか知りません。ここで簡単に紹介します: memcached は効率的かつ高速な分散メモリ オブジェクト キャッシング システムであり、主に WEB 動的アプリケーションを高速化するために使用されます。

2. Memcached のインストール

最初のステップは、memcached の最新バージョン 1.1.12 を公式 Web サイトから直接ダウンロードすることです。また、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
#作る
#インストールを行う
#CD ..
# tar -xzf memcached-1.1.12.tar.gz
# cd memcached-1.1.12
# ./configure --prefix=/usr
#作る
#インストールする

インストールが完了すると、memcached は /usr/bin/memcached にあるはずです。


3. 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 である場合は、このパラメーターを使用してユーザーを指定する必要があります。
  • もちろん、man memcached を実行すると、使用できるパラメータが他にもあります。

4. memcached の仕組み


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

5. PHP を memcached クライアントとして使用する方法


PHP を memcached クライアントとして使用して、オブジェクト アクセス操作のために memcached サービスを呼び出す方法は 2 つあります。
まず、PHP には memcache という拡張機能があります。Linux でコンパイルする場合、Windows では、php.ini の php_memcache.dll の前にあるコメントを削除する必要があります。 。


さらに、展開と再コンパイルによる問題を回避する別の方法として、php-memcached-client を直接使用する方法があります。


この記事では2番目の方法を使用しますが、拡張ライブラリよりも若干効率は悪くなりますが、大きな問題はありません。


6. PHP memcached アプリケーションの例

まず、memcached-client.php をダウンロードします。memcached-client.php をダウンロードした後、このファイル内のクラス「memcached」を通じて memcached サービスを操作できます。実際、コード呼び出しは非常に単純で、使用される主なメソッドは add()、get()、replace()、delete() です。メソッドの説明は次のとおりです。 リーリー

オブジェクトを memcached に書き込みます。$key はオブジェクトのデータです。$exp は秒単位で指定します。


リーリー

オブジェクトの一意の識別子 $key を通じて memcached からオブジェクト データを取得します。

リーリー

$value を使用して、memcached の識別子 $key に置き換えます。パラメータは、$key オブジェクトが存在する場合にのみ機能します。
リーリー


memcached 内の $key という識別子を持つオブジェクトを削除します。 $time は、削除するまでの待機時間を示すオプションのパラメーターです。


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

是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):

<&#63;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); 
&#63;> 

可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。

之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:

  • 用户访问网页时,查看 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() 方法中解决,通过判断时间,符合条件则更新数据库数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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