Zend Framework の紹介

 Learning Zend Framework

appendix

 Zend Framework リファレンス


  • 第36章 Zend_Gdata
  • 第37章 Zend_Http
  • 第38章 Zend_InfoCard
  • 第39章 Zend_Json
  • 第40章 Zend_Layout
  • 第41章 Zend_Ldap
  • 第42章 Zend_Loader
  • 第43章 Zend_Locale
  • 第44章 Zend_Log
  • 第45章 Zend_Mail
  • 第46章 Zend_Markup
  • 第47章 Zend_Measure
  • 第48章 Zend_Memory
  • 第49章 Zend_Mime
  • 第50章 Zend_Navigation
  • 第51章 Zend_Oauth
  • 第52章 Zend_OpenId
  • 第53章 Zend_Paginator
  • 第54章 Zend_Pdf
  • 第55章 Zend_ProgressBar
  • 第56章 Zend_Queue
  • 第57章 Zend_Reflection
  • 第58章 Zend_Registry
  • 第59章 Zend_Rest

  • 第60章 Zend_Search_Lucene
  • 第61章 Zend_Serializer
  • 第62章 Zend_Server
  • 第63章 Zend_Service
  • 第64章 Zend_Session
  • 第65章 Zend_Soap
  • 第66章 Zend_Tag
  • 第67章 Zend_Test
  • 第68章 Zend_Text
  • 第69章 Zend_TimeSync
  • 第70章 Zend_Tool
  • 第71章 Zend_Tool_Framework
  • 第72章 Zend_Tool_Project
  • 第73章 Zend_Translate
  • 第74章 Zend_Uri
  • 第75章 Zend_Validate
  • 第76章 Zend_Version
  • 第77章 Zend_View
  • 第78章 Zend_Wildfire
  • 第79章 Zend_XmlRpc
  • ZendX_Console_Process_Unix
  • ZendX_JQuery
  • Translation 70.6% Update 2010-11-28 - Revision 23415

    第17章 Zend_Cache

    17.1. 導入

    Zend_Cache は、任意のデータをキャッシュするための一般的な手法を提供します。

    Zend Framework におけるキャッシュ処理はフロントエンドで行われ、キャッシュレコードの保存には バックエンドのアダプタ (FileSqliteMemcache...) を使用します。ID およびタグを使用した柔軟な仕組みが用いられています。これらを使用することで、 キャッシュデータの一部だけを削除する (「指定したタグがつけられているキャッシュレコードをすべて削除する」 など) といったことも簡単にできるようになります。

    このモジュールの中心となる部分 (Zend_Cache_Core) は、標準的で柔軟なものとなっています。 設定変更も可能です。とは言え、 特定の目的のためには、より適切な実行結果を得るためのフロントエンド Zend_Cache_Core を拡張する (たとえば OutputFileFunctionClass など) こともできます。

    例 17.1. Zend_Cache::factory() によるフロントエンドの取得

    Zend_Cache::factory() は、適切なオブジェクトを作成してそれらを互いに結び付けます。 この最初の例では、フロントエンドに Core、バックエンドに File を使用します。

    $frontendOptions = array(
       
    'lifetime' => 7200// キャッシュの有効期限を 2 時間とします
       
    'automatic_serialization' => true
    );

    $backendOptions = array(
        
    'cache_dir' => './tmp/' // キャッシュファイルを書き込むディレクトリ
    );

    // Zend_Cache_Core オブジェクトを取得します
    $cache Zend_Cache::factory('Core',
                                 
    'File',
                                 
    $frontendOptions,
                                 
    $backendOptions);

    [注意] 複数の単語からなるフロントエンドやバックエンドについて

    'ZendPlatform' のように複数の単語からなるフロントエンドやバックエンドもあります。 これをファクトリで指定する場合は、単語の間に区切り文字を指定します。 区切り文字としては スペース (' ')、ハイフン ('-') あるいはピリオド ('.') が使用できます。

    例 17.2. データベースへのクエリの結果のキャッシュ

    これでフロントエンドが得られました。あらゆる種類のデータを保存できます (そのために、シリアライズを有効にしました)。例えば、非常に時間がかかるデータベースクエリの結果を キャッシュすることが可能です。いったんキャッシュしてしまえば、 あとはデータベースに接続する必要さえありません。キャッシュから取得したレコードを アンシリアライズしてデータを取得すればよいのです。

    // $cache は先ほどの例で作成したものです

    // キャッシュがすでに存在するかどうかを調べます
    if( ($result $cache->load('myresult')) === false ) {

        
    // キャッシュが見つかりませんでした。データベースに接続します

        
    $db Zend_Db::factory( [...] );

        
    $result $db->fetchAll('SELECT * FROM huge_table');

        
    $cache->save($result'myresult');

    } else {

        
    // キャッシュが見つかりました! 大声で叫びましょう
        
    echo "これはキャッシュからのデータです!\n\n";

    }

    print_r($result);

    例 17.3. Zend_Cache 出力フロントエンドによる出力のキャッシュ

    まず、出力をキャッシュしたい部分を何らかの条件式で「マークアップ」し、 その前後を start() メソッドおよび end() メソッドで囲みます (これは最初の例に似ており、キャッシュ処理の基本となる考え方です)。

    内部では、通常通りに出力を行います。出力内容は、 end() メソッドに到達するまでずっとキャッシュされます。次回の実行時には、 このセクションが読み飛ばされ、その代わりにキャッシュから取得したデータが使用されます (キャッシュレコードが有効なものである限ります)。

    $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 (save() および start() で使用します) に十分な注意を払うようにしましょう。 これは、キャッシュしようとしているリソース内で一意である必要があります。 さもないと、無関係なレコードによってキャッシュを削除されてしまったり、 さらに悪いことにはまったく無関係な場所に表示されてしまったりなどという問題が起こります。

    digg delicious meneame google twitter technorati facebook

    Comments

    Loading...