SYSTEM238 / NOTES1 / Zend Framework1 / ZF1のキャッシュを使用する。

NOTES1 PROG1
ZF1のキャッシュを使用する。
Zend Framework1(ZF1)でキャッシュを使用する手順のノート

クラスをキャッシュする

スタティックメソッドのコールおよびオブジェクトをキャッシュします。

クラス名を設定すると、抽象クラスおよびスタティックコールをキャッシュします。オブジェクトを設定すると、そのオブジェクトのメソッドをキャッシュします。

特定の"クラス::メソッド"が遅い場合にキャッシュを適用する一番簡単な方法です。クラスのインスタンスの生成(newする)部分を修正するだけで他のコードに手を入れずキャッシュを適用する事が出来ます。

ただし、キャッシュのコントロールパラメタは保存期間と対象メソッドしか無く、特定キャッシュのリフレッシュなど細かいコントロールができません。

データの更新頻度や範囲によっては利用できないかもしれません。その場合は次に説明する「基本的なキャッシュ」を使用してください。

[時間のかかるメソッドのあるクラス] ---------------------------
class Test
{
    public function slowlyMethod($p1, $p2)  //遅い
    {
        //メソッドの返り値だけでなく、メソッド中で出力した値もキャッシュされる。
        echo date('H:i:s'); //キャッシュ対象
        ..遅い処理..
        return ...;         //キャッシュ対象
    }

    public function etcNoCacheMethod()  //遅くない
    {
        ....
    }
}

[改善前] ----------------------------------------
$Test   = new Test();

$Test->slowlyMethod($p1, $p2);      //遅い
$Test->etcNoCacheMethod();

[改善後] ----------------------------------------
require_once('Zend/Cache.php');

//インスタンス生成部分のみ修正
$Test   = Zend_Cache::factory(
    //キャッシュのタイプ指定、フロントエンド:Class、バックエンド:File
    'Class', 'File',
    //フロントエンドの設定
    array(
        'cached_entity'=>new Test(),    //キャッシュするインスタンスを登録
        'lifetime'=>600,                //キャッシュする秒数
        'non_cached_methods'=>array('etcNoCacheMethod') //キャッシュしないメソッドを指定する
    ),
    //バックエンドの指定
    array(
        'cache_dir'=>'/.../temp/cache'  //キャッシュデータ格納先
    )
);

//他の既存コードは修正しなくてもオッケー!!
$Test->slowlyMethod($p1, $p2);  //キャッシュされる、しかもパラメタも認識してくれるブラボー!!
$Test->etcNoCacheMethod();      //キャッシュされない

基本的なキャッシュ

基本的なキャッシュです。キャッシュのコントロールを自身で記述するのでキャッシュを柔軟に扱えます。

$cache = Zend_Cache::factory(
    //キャッシュのタイプ指定、フロントエンド:Core、バックエンド:File
    'Core', 'File',
    //フロントエンドの設定
    array(
        'lifetime' => 600,                  //キャッシュする秒数
        'automatic_serialization'=>true     //文字列以外をキャッシュする場合はtrue  (遅くなる)
    ),
    //バックエンドの指定
    array(
        'cache_dir'=> $cacheConf['cache_dir']   //キャッシュデータ格納先
    )
);

//キャッシュからデータ取得する。ない場合はデータ取得してキャッシュに保存する。('hoge'はキャッシュID)
if (($cacheData = $cache->load('hoge')) === false){
    //キャッシュヒットしなかったのでデータ取得
    $cacheData  = ** なにかデータをセットする「時間のかかる」処理 **;
    //キャッシュに保存('hoge'はキャッシュID)
    $cache->save($cacheData, 'hoge');
}

//cacheDataにはキャッシュ経由 or 新規生成データがセットされている
Zend_Debug::dump($cacheData,'$cacheData: ');



//キャッシュIDを指定して削除できる
$cache->remove('hoge');

//すべてのキャッシュを削除する場合
$cache->clean(Zend_Cache::CLEANING_MODE_ALL);

// 有効期限切れのキャッシュを削除する
$cache->clean(Zend_Cache::CLEANING_MODE_OLD);



//キャッシュID以外にタグを付ける事もできる
$cache->save($cacheData, 'hoge', array('tagA', 'tagB', 'tagC'));

//'tagA' && 'tagC'のキャッシュを削除する場合
$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('tagA', 'tagC'));

// 'tagA' || 'tagC'のキャッシュを削除する場合
$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, array('tagA', 'tagC'));

// !('tagA' || 'tagC')のキャッシュを削除する場合
$cache->clean(Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, array('tagA', 'tagC'));