Zend_Cache_Core
は特別なフロントエンドであり、
モジュールのコアに含まれています。これはキャッシュフロントエンドの
基本機能を実装したものであり、他のクラスによってオーバーライドされます。
注意 | |
---|---|
その他のフロントエンドクラスは、すべて |
これらのオプションを、先の例で示したようにファクトリメソッドに渡します。
表 2.1. 使用可能なオプション
オプション | データ型 | デフォルト値 | 説明 |
---|---|---|---|
caching |
boolean |
true |
キャッシングを有効/無効にします (キャッシュされたスクリプトのデバッグ時に有用です)。 |
lifeTime |
int |
3600 |
キャッシュの有効期間 (秒)。null
を指定すると、有効期間が無期限となります。
|
logging |
boolean |
false |
true を指定すると、Zend_Log によるロギングが有効になります
(しかし、処理速度は低下します)。
|
writeControl |
boolean |
true |
書き込み制御を有効/無効にします (壊れたエントリを検出するため、 書き込んだ直後にそのキャッシュを読み込みます)。 writeControl を有効にすると、キャッシュの書き込みがやや遅くなりますが、 読み込みの速度は変わりません (これはキャッシュファイルが壊れているかどうかを調べるものですが、 完全に判断できるわけではありません)。 |
automaticSerialization |
boolean |
false |
自動シリアライズを有効/無効にします。 文字列でないデータを直接保存する際に使用します (しかし、処理速度は低下します)。 |
automaticCleaningFactor |
int |
0 |
自動クリーンアッププロセス (ガベージコレクタ) の設定を行います。 0 を指定すると、自動キャッシュクリーニングを行いません。 1 を指定すると計画的にキャッシュのクリーニングを行い、また x (1 よりおおきな整数) を指定すると、 x 回のキャッシュ書き込みについて 1 回の頻度で ランダムに自動クリーニングを行います。 |
マニュアルのいちばんはじめのほうに、例を示しています。
もしキャッシュに文字列しか保存しないのなら ("automaticSerialization" オプションを使用すると boolean も保存できるので)、 このようにもう少しコンパクトに作成することが可能です。
<?php // すでに $cache が存在するものとします $id = 'myBigLoop'; //「キャッシュしたい内容」のキャッシュ ID if (!($data = $cache->get($id))) { // キャッシュが存在しませんでした $data = ''; for ($i = 0; $i < 10000; $i++) { $data = $data . $i; } $cache->save($data); } // [...] $data を用いて何かをします (echo したり、何かに渡したりなど) ?>
複数のブロックやデータのインスタンスをキャッシュしたい場合も、考え方は同じです。
<?php // 一意な ID を使用するようにしましょう $id1 = 'foo'; $id2 = 'bar'; // ブロック 1 if (!($data = $cache->get($id1))) { // キャッシュが存在しませんでした $data = ''; for ($i=0;$i<10000;$i++) { $data = $data . $i; } $cache->save($data); } echo($data); // これは、キャッシュ処理の影響を受けません echo('キャッシュされません !'); // ブロック 2 if (!($data = $cache->get($id2))) { // キャッシュが存在しませんでした $data = ''; for ($i=0;$i<10000;$i++) { $data = $data . '!'; } $cache->save($data); } echo($data); ?>
Zend_Cache_Frontend_Output
は、出力を横取りするフロントエンドです。
これは PHP の出力バッファリング処理を使いやすくしたもので、
start()
メソッドと
end()
メソッドの間の出力を横取りします。
このマニュアルの冒頭に示した例とほとんど同じですが、少しだけ変更を加えています。
<?php // キャッシュが見つからなかった場合に、出力バッファリングが起動します if(!$cache->start('mypage')): // すべてをいつもどおりに出力します echo 'Hello world! '; echo 'これはキャッシュされます ('.time().') '; $cache->end(); // 出力バッファリングを終了します endif; echo 'これはキャッシュされません ('.time().')'; ?>
この形式を使用すると、既存のプロジェクトに簡単に出力キャッシュ処理を追加することができます。 コードのリファクタリングもほとんど行わずにすませられるでしょう。
Zend_Cache_Frontend_Function
は、関数コールの結果をキャッシュします。
call()
というメソッドを保持しており、
関数名とパラメータを配列にしてこのメソッドに渡します。
call()
関数の使用法は、PHP の
call_user_func_array()
と同じです。
<?php $cache->call('veryExpensiveFunc', $params); # $params は配列です。 # 例えば、veryExpensiveFunc(1, 'foo', 'bar') のコールをキャッシュするには # $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar')) とします。 ?>
Zend_Cache_Frontend_Function
は、
関数の返り値だけでなく関数内部での出力もキャッシュします。
注意 | |
---|---|
|
Zend_Cache_Frontend_Class
は、Zend_Cache_Frontend_Function
と異なり、オブジェクトおよびスタティックメソッドのコールをキャッシュします。
例えば、スタティックメソッドのコールをキャッシュするには次のようにします。
<?php class test { # スタティックメソッド public static function foobar($param1, $param2) { echo "foobar_output($param1, $param2)"; return "foobar_return($param1, $param2)"; } } // [...] $frontendOptions = array( 'cachedEntity' => 'test' // クラス名を指定します ); // [...] # これはキャッシュされます $res = $cache->foobar('1', '2'); ?>
通常のメソッドのコールをキャッシュするには次のようにします。
<?php class test { private $_string = 'hello !'; public function foobar2($param1, $param2) { echo($this->_string); echo "foobar2_output($param1, $param2)"; return "foobar2_return($param1, $param2)"; } } // [...] $frontendOptions = array( 'cachedEntity' => new test() // クラスのインスタンスを指定します ); // [...] # これはキャッシュされます $res = $cache->foobar2('1', '2'); ?>
Zend_Cache_Frontend_File
は、マスタファイルの
「更新時刻」にもとづいて動作するフロントエンドです。
これは、例えば設定ファイルやテンプレートなどで有効に使えるでしょう。
例えば、XML の設定ファイルを使用しており、それが「設定オブジェクト」
(Zend_Config
など) を返す関数でパースされるとしましょう。
Zend_Cache_Frontend_File
を使用すると、その「設定オブジェクト」
をキャッシュすることができ (これにより、
XML ファイルを毎回パースする必要がなくなります)、さらに「マスタファイル」
との間で強力な依存性を保持することができます。そのため、XML
設定ファイルが更新されると、即時にキャッシュが無効になります。
Zend_Cache_Frontend_Page
は Zend_Cache_Frontend_Output
と似ていますが、ページ全体をキャッシュする目的で設計されています。
Zend_Cache_Frontend_Page
を使用して、
ページの一部だけをキャッシュすることはできません。
一方、「キャッシュ ID」は自動的に生成されます。この ID は、
$_SERVER['REQUEST_URI']
および (オプションの設定によっては)
$_GET
、$_POST
、$_SESSION
、
$_COOKIE
、$_FILES
をもとにして生成されます。
さらに、ひとつのメソッド (start()
) をコールするだけで使用できます。
end()
は、ページの終了時に自動的にコールされます。
現時点ではまだ実装されていませんが、将来は HTTP conditional システムを追加する予定です。 これにより、ネットワークの帯域を節約できるようになります (キャッシュにヒットし、かつブラウザがそのバージョンを既に持っている場合に HTTP 304 Not Modified を送信するようにします)。
注意 | |
---|---|
Zend_Cache_Frontend_Page は「アルファ版」であり、 実用できるようになるまでにはまだまだ時間がかかるでしょう。 |
表 2.5. 使用可能なオプション
オプション | データ型 | デフォルト値 | 説明 |
---|---|---|---|
httpConditional |
boolean |
false |
httpConditional システムを使用します (現時点ではまだ実装されていません)。 |
cacheWith{Get,Post,Session,Files,Cookie}Variables |
boolean |
false |
true の場合は、対応するスーバーグローバル配列に 変数が含まれていてもキャッシュはオンのままです。 false の場合は、対応するスーバーグローバル配列に 何らかの変数が含まれている場合にキャッシュをオフにします。 |
makeIdWith{Get,Post,Session,Files,Cookie}Variables |
boolean |
true |
true の場合は、対応するスーパーグローバル配列の内容を使用して キャッシュ ID を作成します。false の場合は、キャッシュ ID は対応するスーパーグローバル配列の内容に依存しません。 |