Zend_Cacheとは。
http://framework.zend.com/manual/ja/zend.cache.introduction.html
> Zend_Cache は、任意のデータをキャッシュするための一般的な手法を提供します。
なんだそれは。
ドキュメントの説明は長々と書いてあって丁寧は丁寧なのですが、長すぎて読むのがしんどいです。
簡単に言うとSmartyキャッシュで、要はob_start()、ob_end_clean()、file_put_contents()、file_get_contents()あたりを纏めてパッケージングしたようなものとなります。
とりあえず簡単な例を作ってみます。
ちなみにリファレンスでは最初にZend_Cache::start()とZend_Cache::end()が紹介されていますが不要なので忘れましょう。
zend_cache1.php
Zend_Cache::factory()でインスタンスを作って、save()で保存、load()で取得するというそれだけの話です。
今回は'hoge'だけですが、ここに一意のIDを指定することで、複数の内容を保存することもできます。
バックエンドはそのまま、保存先に何を使用するかということです。
今回は'./tmp'フォルダにファイルとして保存しています。
フロントエンドは何を保存するか、という意味になります。
Coreは最も単純なフロントエンドで、静的文字列を保存します。
フロントエンドオプションのautomatic_serializationはデフォルトではfalseで、その状態だと本当にただのテキストで保存されます。
さすがに文字列しか保存できないといくら何でも役に立たないのでtrueにしておきましょう。
serialize()できるものならなんでも保存できるようになります。
以上でキャッシュを利用できるようになりました。
最初に実行した際に、キャッシュする内容が取得されて保存されます。
その後30秒間は何度読み込んでも保存したキャッシュが読み込まれるため、具体的なロジックは実行されません。
有効期限が過ぎると、それまでのキャッシュは無かったものとなり、再びキャッシュする内容が取得されて保存されることになります。
今回は取得する部分がただの文字列だったのでまったくなんのありがたみもありませんでしたが、これが一回10秒かかるDBアクセスだったりしたらどうなるか。
かわりにsleep()を仕込んでみたりすると、どれだけ快適になるかがわかると思います。
さて、デフォルトだとフロントエンドオプションのautomatic_cleaning_factorによって10回に1回ガベージコレクタが起動するようになっているように読めるのですが、実際には行われません。
キャッシュファイルはいつまでも残り続けます。
セッションと違いファイル名は変わらないのでファイルが際限なく増えたりする心配はないのですが、削除を行うメソッドも用意されています。
ていうか、フロントエンドでガベージコレクタって一体何するんだ?
バックエンドじゃないのか?
http://framework.zend.com/manual/ja/zend.cache.introduction.html
> Zend_Cache は、任意のデータをキャッシュするための一般的な手法を提供します。
なんだそれは。
ドキュメントの説明は長々と書いてあって丁寧は丁寧なのですが、長すぎて読むのがしんどいです。
簡単に言うとSmartyキャッシュで、要はob_start()、ob_end_clean()、file_put_contents()、file_get_contents()あたりを纏めてパッケージングしたようなものとなります。
とりあえず簡単な例を作ってみます。
ちなみにリファレンスでは最初にZend_Cache::start()とZend_Cache::end()が紹介されていますが不要なので忘れましょう。
zend_cache1.php
<?php //Zend_Cache require_once('Zend/Cache.php'); //フロントエンドはCore(文字列のみ)を使用 $zf_cache_frontend = 'Core'; //フロントエンドオプション $zf_cache_frontend_option = array( //キャッシュの有効期限 'lifetime' => 30 //シリアライズする ,'automatic_serialization' => true ); //バックエンドはFileを使用 $zf_cache_backend = 'File'; //バックエンドオプション $zf_cache_backend_option = array( //キャッシュを保存するディレクトリ 'cache_dir' => './tmp/' ); //インスタンス $zf_cache = Zend_Cache::factory($zf_cache_frontend, $zf_cache_backend, $zf_cache_frontend_option, $zf_cache_backend_option); //キャッシュを取得する $cache = $zf_cache->load('hoge'); //キャッシュが取得できなければ if(!$cache){ //キャッシュする内容を取得 本来はなんか重い処理 $cache = 'abcde'; //キャッシュに保存 $zf_cache->save($cache, 'hoge'); } //表示 print($cache);
Zend_Cache::factory()でインスタンスを作って、save()で保存、load()で取得するというそれだけの話です。
今回は'hoge'だけですが、ここに一意のIDを指定することで、複数の内容を保存することもできます。
バックエンドはそのまま、保存先に何を使用するかということです。
今回は'./tmp'フォルダにファイルとして保存しています。
フロントエンドは何を保存するか、という意味になります。
Coreは最も単純なフロントエンドで、静的文字列を保存します。
フロントエンドオプションのautomatic_serializationはデフォルトではfalseで、その状態だと本当にただのテキストで保存されます。
さすがに文字列しか保存できないといくら何でも役に立たないのでtrueにしておきましょう。
serialize()できるものならなんでも保存できるようになります。
以上でキャッシュを利用できるようになりました。
最初に実行した際に、キャッシュする内容が取得されて保存されます。
その後30秒間は何度読み込んでも保存したキャッシュが読み込まれるため、具体的なロジックは実行されません。
有効期限が過ぎると、それまでのキャッシュは無かったものとなり、再びキャッシュする内容が取得されて保存されることになります。
今回は取得する部分がただの文字列だったのでまったくなんのありがたみもありませんでしたが、これが一回10秒かかるDBアクセスだったりしたらどうなるか。
かわりにsleep()を仕込んでみたりすると、どれだけ快適になるかがわかると思います。
さて、デフォルトだとフロントエンドオプションのautomatic_cleaning_factorによって10回に1回ガベージコレクタが起動するようになっているように読めるのですが、実際には行われません。
キャッシュファイルはいつまでも残り続けます。
セッションと違いファイル名は変わらないのでファイルが際限なく増えたりする心配はないのですが、削除を行うメソッドも用意されています。
//特定のキャッシュを削除 $zf_cache->remove('hoge'); //有効期限切れのキャッシュを削除 $zf_cache->clean(Zend_Cache::CLEANING_MODE_OLD); //全キャッシュを削除 $zf_cache->clean(Zend_Cache::CLEANING_MODE_ALL);
ていうか、フロントエンドでガベージコレクタって一体何するんだ?
バックエンドじゃないのか?
PR
トラックバック
トラックバックURL: