インターネットにはこのトピックに関する多くの情報がありますが、それにもかかわらず、多くの人はそれを迂回します。 この投稿の目的は、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.基本操作
- <?php
- //新しいオブジェクトを作成します。 手続き型で書くこともできます
- $ memcache_obj = new Memcache ;
- //サーバーに接続します
- $ memcache_obj- > connect ( '127.0.0.1' 、 11211 )またはdie ( "Could not connect" ) ;
- //キーour_varでオブジェクトを取得しようとします
- $ var_key = @ $ memcache_obj- > get ( 'our_var' ) ;
- if ( ! empty ( $ var_key ) )
- {
- //オブジェクトがキャッシュされている場合、その値を出力します
- echo $ var_key ;
- }
- 他に
- {
- //キーour_varを持つオブジェクトがキャッシュにない場合、作成します
- // Our_varオブジェクトは5秒間保存され、圧縮されません
- $ memcache_obj- > set ( 'our_var' 、 date ( 'G:i:s' ) 、 false 、 5 ) ;
- //キャッシュされたデータを取得します
- echo $ memcache_obj- > get ( 'our_var' ) ;
- }
- // Memcachedサーバーへの接続を閉じます
- $ memcache_obj- > close ( ) ;
- ?>
このコードを実行すると、毎秒秒の精度で時間が表示されます。 ただし、キャッシュがクリアされるまで5秒ごとに更新されます。 この例では、最も単純な操作が示されていますが、パフォーマンスでは勝つよりも失う可能性が高くなります。 結局のところ、サーバーに接続する必要があるたびに...
2.生産性を高める
2.1キャッシングあり
- < ? php
- 関数LoadCPU ( )
- {
- //プロセッサをロードする関数
- //画像800x600を作成
- $ image = imagecreate ( 800、600 ) ;
- //白い背景色
- $ color = imagecolorallocate ( $ image、255、255、255 ) ;
- //黒
- $ color2 = imagecolorallocate ( $ image、 0、0、0 ) ;
- for ( $ i = 0 ; $ i < 10000 ; $ i ++ ) {
- // 10,000ポイントをランダムな順序で配置します
- imagesetpixel ( $ image、 rand ( 0、800 ) 、 rand ( 0、600 ) 、$ color2 ) ;
- }
- //ポインターを投げる
- $イメージを返し ます。
- }
- //新しいMemcacheオブジェクトを作成します
- $ memcache_obj = new Memcache ;
- //サーバーに接続します
- $ memcache_obj- > connect ( '127.0.0.1' 、 11211 )またはdie ( "Could not connect" ) ;
- //キー画像でオブジェクトを取得しよう
- $ image_bin = @ $ memcache_obj- > get ( 'image' ) ;
- if ( empty ( $ image_bin ) ) {
- //キャッシュに画像がない場合は、生成してキャッシュします
- imagepng ( LoadCPU ( ) 、getcwd ( ) 。 '/tmp.png'、9 ) ;
- $ image_bin = file_get_contents ( getcwd ( ) 。 '/tmp.png' ) ;
- unlink ( getcwd ( ) 。 '/tmp.png' ) ;
- $ memcache_obj- > set ( 'image' 、$ image_bin、 false 、 30 ) ;
- }
- //キャッシュから画像を取得します
- header ( 'Content-type:image / png' ) ;
- echo $ image_bin ;
- // Memcachedサーバーへの接続を閉じます
- $ memcache_obj- > close ( ) ;
- ? >
この例では、800x600サイズのイメージを作成し、10,000ポイントを配置する関数が提供されています。 一度、そのような画像を生成すると、将来、それを再度生成せずに画面に表示するだけです。
2.2キャッシュなし
- <?php
- 関数 LoadCPU ( )
- {
- //プロセッサをロードする関数
- //画像800x600を作成
- $ image = imagecreate ( 800、600 ) ;
- //白い背景色
- $ color = imagecolorallocate ( $ image 、 255、255、255 ) ;
- //黒
- $ color2 = imagecolorallocate ( $ image 、 0、0、0 ) ;
- for ( $ i = 0 ; $ i < 10000 ; $ i ++ ) {
- // 10,000ポイントをランダムな順序で配置します
- imagesetpixel ( $ image 、 rand ( 0、800 ) 、 rand ( 0、600 ) 、 $ color2 ) ;
- }
- //ポインターを投げる
- $イメージを 返し ます。
- }
- //キャッシングなしで画像を表示
- header ( 'Content-type:image / png' ) ;
- imagepng ( LoadCPU ( ) 、 '' 、 9 ) ;
- ?>
ここでは、すべてがはるかにシンプルでより身近なものになっています。画像を毎回生成します。
結果
両方のスクリプトのパフォーマンスをテストしました。 最初のケースの同じマシンは、1秒あたり460の応答を返し、2番目のケースでは10のみでした。
より便利な機能
addServer-複数のキャッシングサーバーを自由に使用できる場合、サーバーをプールに追加してクラスターを作成できます。
重量パラメータに注意してください。 特定のサーバーで使用可能なメモリ量を示します。
delete-名前から、このメソッドが指定されたキーを持つオブジェクトをキャッシュから削除することは明らかです。
replace-オブジェクトの値を指定されたキーに置き換えます。 有効期限が切れる前にオブジェクトの内容を変更する必要がある場合に使用します。
まとめ
私の観点からは、キャッシングは負荷の高いリソースでのみ使用する必要があります。 結局のところ、Memcachedサーバーに接続するたびに、貴重な時間を費やすことになります。 大規模なプロジェクトの場合は、サービスが存在すると考えて、後の段階で行うよりも、すぐに多くのコード行を記述する方が適切です。 また、メモリを消費することを忘れないでください! キャッシュに300メガバイトを入れると、300メガバイトのRAMが必要になることに注意してください...
結論として、この記事ではテクノロジーのすべての魅力を明らかにしているわけではありませんが、皆さんが自己改善に刺激されることを願っています。 読んでくれてありがとう、dear%username%!
UPD:別の興味深い点。 Memcached、libmemcached用のPHP APIがあります。 Memcache、libmemcachedを使用しないphp用ライブラリ。