Zend_Cache
は、任意のデータをキャッシュするための一般的な手法を提供します。
Zend Framework におけるキャッシュ処理はフロントエンドで行われ、キャッシュレコードの保存には
バックエンドのアダプタ (File
、Sqlite
、Memcache
...)
を使用します。ID およびタグを使用した柔軟な仕組みが用いられています。これらを使用することで、
キャッシュデータの一部だけを削除する (「指定したタグがつけられているキャッシュレコードをすべて削除する」
など) といったことも簡単にできるようになります。
このモジュールの中心となる部分 (Zend_Cache_Core
) は、標準的で柔軟なものとなっています。
設定変更も可能です。とは言え、
特定の目的のためには、より適切な実行結果を得るためのフロントエンド
Zend_Cache_Core
を拡張する
(たとえば Output
、File
、Function
、Class
など)
こともできます。
例 4.1. Zend_Cache::factory()
によるフロントエンドの取得
Zend_Cache::factory()
は、適切なオブジェクトを作成してそれらを互いに結び付けます。
この最初の例では、フロントエンドに Core
、バックエンドに File
を使用します。
<?php require_once 'Zend/Cache.php'; $frontendOptions = array( 'lifetime' => 7200, // キャッシュの有効期限を 2 時間とします 'automatic_serialization' => true ); $backendOptions = array( 'cache_dir' => './tmp/' // キャッシュファイルを書き込むディレクトリ ); // Zend_Cache_Core オブジェクトを取得します $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); ?>
これでフロントエンドが得られました。あらゆる種類のデータを保存することができます (そのために、シリアライズを有効にしました)。例えば、非常に時間がかかるデータベースクエリの結果を キャッシュすることが可能です。いったんキャッシュしてしまえば、 あとはデータベースに接続する必要さえありません。キャッシュから取得したレコードを アンシリアライズしてデータを取得すればよいのです。
<?php // $cache は先ほどの例で作成したものです // キャッシュがすでに存在するかどうかを調べます if(!$result = $cache->load('myresult')) { // キャッシュが見つかりませんでした。データベースに接続します $db = Zend_Db::factory( [...] ); $result = $db->fetchAll('SELECT * FROM huge_table'); $cache->save($result, 'myresult'); } else { // キャッシュが見つかりました! 大声で叫びましょう echo "これはキャッシュからのデータです!\n\n"; } print_r($result); ?>
例 4.2. Zend_Cache
出力フロントエンドによる出力のキャッシュ
まず、出力をキャッシュしたい部分を何らかの条件式で「マークアップ」し、
その前後を start()
メソッドおよび end()
メソッドで囲みます (これは最初の例に似ており、キャッシュ処理の基本となる考え方です)。
内部では、通常通りに出力を行います。出力内容は、 end()
メソッドに到達するまでずっとキャッシュされます。次回の実行時には、
このセクションが読み飛ばされ、その代わりにキャッシュから取得したデータが使用されます
(キャッシュレコードが有効なものである限ります)。
<?php $frontendOptions = array( 'lifetime' => 30, // キャッシュの有効期間は 30 秒です 'automatic_serialization' => false // これはデフォルト値です ); $backendOptions = array('cache_dir' => './tmp/'); $cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions); // start() メソッドに一意な ID を渡します if(!$cache->start('mypage')) { // 通常通りに出力します echo 'Hello world! '; echo 'これはキャッシュされます ('.time().') '; $cache->end(); // 出力が保存され、ブラウザに送信されます } echo 'これはキャッシュされません ('.time().').'; ?>
time()
の結果を二度出力していることに注目しましょう。
動作説明のため、何らかの動的な出力がほしかったのです。これを実行し、
さらに何度か「最新の情報に更新」してみましょう。
ふたつめの値が時とともに変化していくのに対して、
最初の方の値は変化しないことに気づかれるでしょう。
なぜなら、最初の値はキャッシュされたセクションの出力であり、
その他の内容とともにキャッシュに保存されているからです。
30 秒経過すると (有効期限を 30 秒に設定したので)、
ふたつの値は再び一致するようになります。これはキャッシュレコードが
有効期限切れになり、もう一度キャッシュしなおされたからです。
この例は、ブラウザあるいはコンソールで試してみてください。
注意 | |
---|---|
Zend_Cache を使用する際には、キャッシュ ID ( |