MemcachedおよびPHP教育プログラム

インターネットにはこのトピックに関する多くの情報がありますが、それにもかかわらず、多くの人はそれを迂回します。 この投稿の目的は、Memcachedを指で操作する基本を説明することです。



Memcacheとは何で、PHPとは何の関係がありますか?



Memcacheは、生成に多くのリソースを必要とするデータをキャッシュするように設計されています。 この種のデータには、データベースへのクエリの結果からテンプレートの重い部分まで何でも含めることができます。 Memcachedは、PHPに同梱されているコアモジュールセットの一部ではありませんが、peclリポジトリで利用できます。



インストールとセットアップ



Debianを問題のディストリビューションとして使用することにしました。これは、Webサーバーを作成するときに最も頻繁に使用されるためです。 PHPのMemcachedモジュールはすでにリポジトリ(php5-memcached)にコンパイルされていますが、すべてのリポジトリがDebianほどリッチではないため、ソースコードからインストールプロセスを説明します。



Memcachedサーバーをインストールする



#apt-get memcachedをインストール

開始するには、次の設定で十分です。

#/ etc / memcached.conf

#Memcachedはデーモンのように動作します

-d

#ログはそこに置かれます

ログファイル/ var / log / memcached.log

#ストレージ用に256 MBのRAMを割り当てる

-m 256

#このポートはリッスンします

-p 11211

#その後、変更することが望ましい

-u誰も

#localhostを聞く

-l 127.0.0.1


#/ etc / init.d / memcached restart



確認する


#netstat -tap | grep memcached

tcp 0 0 localhost: 11211 ** LISTEN 13036 / memcached


PHP用のモジュールをコンパイルしてインストールする



apt-get install php5-dev libmemcache-dev



peclダウンロードmemcache

tar xzvf memcache-2.2.6.tgz

cd memcache-2.2.6 /

phpize &&/ configure --enable-memcache && make

cpモジュール/ memcache.so / usr / lib / php5 / 20060613 /



echo 'extension = memcache.so' >> / etc / php5 / apache2 / php.ini

/ etc / init.d / apache2 restart


以上です! まったく複雑ではありません。

使用例



1.基本操作



  1. <?php
  2. //新しいオブジェクトを作成します。 手続き型で書くこともできます
  3. $ memcache_obj = new Memcache ;
  4. //サーバーに接続します
  5. $ memcache_obj- > connect '127.0.0.1' 11211 またはdie "Could not connect" ;
  6. //キーour_varでオブジェクトを取得しようとします
  7. $ var_key = @ $ memcache_obj- > get 'our_var' ;
  8. if empty $ var_key
  9. {
  10. //オブジェクトがキャッシュされている場合、その値を出力します
  11. echo $ var_key ;
  12. }
  13. 他に
  14. {
  15. //キーour_varを持つオブジェクトがキャッシュにない場合、作成します
  16. // Our_varオブジェクトは5秒間保存され、圧縮されません
  17. $ memcache_obj- > set 'our_var' date 'G:i:s' false 5 ;
  18. //キャッシュされたデータを取得します
  19. echo $ memcache_obj- > get 'our_var' ;
  20. }
  21. // Memcachedサーバーへの接続を閉じます
  22. $ memcache_obj- > close ;
  23. ?>


このコードを実行すると、毎秒秒の精度で時間が表示されます。 ただし、キャッシュがクリアされるまで5秒ごとに更新されます。 この例では、最も単純な操作が示されていますが、パフォーマンスでは勝つよりも失う可能性が高くなります。 結局のところ、サーバーに接続する必要があるたびに...



2.生産性を高める





2.1キャッシングあり


  1. < php
  2. 関数LoadCPU
  3. {
  4. //プロセッサをロードする関数
  5. //画像800x600を作成
  6. $ image = imagecreate 800、600 ;
  7. //白い背景色
  8. $ color = imagecolorallocate $ image、255、255、255 ;
  9. //黒
  10. $ color2 = imagecolorallocate $ image、 0、0、0 ;
  11. for $ i = 0 ; $ i < 10000 ; $ i ++ {
  12. // 10,000ポイントをランダムな順序で配置します
  13. imagesetpixel $ image、 rand 0、800 rand 0、600 、$ color2 ;
  14. }
  15. //ポインターを投げる
  16. $イメージを返し ます。
  17. }
  18. //新しいMemcacheオブジェクトを作成します
  19. $ memcache_obj = new Memcache ;
  20. //サーバーに接続します
  21. $ memcache_obj- > connect '127.0.0.1'11211 またはdie "Could not connect" ;
  22. //キー画像でオブジェクトを取得しよう
  23. $ image_bin = @ $ memcache_obj- > get 'image' ;
  24. if empty $ image_bin {
  25. //キャッシュに画像がない場合は、生成してキャッシュします
  26. imagepng LoadCPU 、getcwd '/tmp.png'、9 ;
  27. $ image_bin = file_get_contents getcwd '/tmp.png' ;
  28. unlink getcwd '/tmp.png' ;
  29. $ memcache_obj- > set 'image' 、$ image_bin、 false30 ;
  30. }
  31. //キャッシュから画像を取得します
  32. header 'Content-type:image / png' ;
  33. echo $ image_bin ;
  34. // Memcachedサーバーへの接続を閉じます
  35. $ memcache_obj- > close ;
  36. >


この例では、800x600サイズのイメージを作成し、10,000ポイントを配置する関数が提供されています。 一度、そのような画像を生成すると、将来、それを再度生成せずに画面に表示するだけです。



2.2キャッシュなし


  1. <?php
  2. 関数 LoadCPU
  3. {
  4. //プロセッサをロードする関数
  5. //画像800x600を作成
  6. $ image = imagecreate 800、600 ;
  7. //白い背景色
  8. $ color = imagecolorallocate $ image 255、255、255 ;
  9. //黒
  10. $ color2 = imagecolorallocate $ image 0、0、0 ;
  11. for $ i = 0 ; $ i < 10000 ; $ i ++ {
  12. // 10,000ポイントをランダムな順序で配置します
  13. imagesetpixel $ image rand 0、800 rand 0、600 $ color2 ;
  14. }
  15. //ポインターを投げる
  16. $イメージを 返し ます。
  17. }
  18. //キャッシングなしで画像を表示
  19. header 'Content-type:image / png' ;
  20. imagepng LoadCPU '' 9 ;
  21. ?>


ここでは、すべてがはるかにシンプルでより身近なものになっています。画像を毎回生成します。



結果


両方のスクリプトのパフォーマンスをテストしました。 最初のケースの同じマシンは、1秒あたり460の応答を返し、2番目のケースでは10のみでした。

memcache





より便利な機能





addServer-複数のキャッシングサーバーを自由に使用できる場合、サーバーをプールに追加してクラスターを作成できます。 重量パラメータに注意してください。 特定のサーバーで使用可能なメモリ量を示します。

delete-名前から、このメソッドが指定されたキーを持つオブジェクトをキャッシュから削除することは明らかです。

replace-オブジェクトの値を指定されたキーに置き換えます。 有効期限が切れる前にオブジェクトの内容を変更する必要がある場合に使用します。



まとめ



私の観点からは、キャッシングは負荷の高いリソースでのみ使用する必要があります。 結局のところ、Memcachedサーバーに接続するたびに、貴重な時間を費やすことになります。 大規模なプロジェクトの場合は、サービスが存在すると考えて、後の段階で行うよりも、すぐに多くのコード行を記述する方が適切です。 また、メモリを消費することを忘れないでください! キャッシュに300メガバイトを入れると、300メガバイトのRAMが必要になることに注意してください...

結論として、この記事ではテクノロジーのすべての魅力を明らかにしているわけではありませんが、皆さんが自己改善に刺激されることを願っています。 読んでくれてありがとう、dear%username%!



UPD:別の興味深い点。 Memcached、libmemcached用のPHP APIがあります。 Memcache、libmemcachedを使用しないphp用ライブラリ。



All Articles