出力のキャッシュ可能性の制御

キャッシュを有効にすると、通常は最終的なページの出力のすべてがキャッシュされます。 しかし、Smarty3 では、出力の特定の部分だけキャッシュしないようにできるオプションも用意しています。

全般的な注意

キャッシュされていない部分で使ったすべての変数は、 ページをキャッシュから読み込んだときに PHP から新たに代入されることに注意しましょう。

テンプレートセクションのキャッシュ可能性

テンプレートの大きなセクションをキャッシュ対象外にするには、 {nocache} タグと {/nocache} タグを使います。

例 15.10. テンプレートのセクションをキャッシュ対象外にする



Today's date is
{nocache}
{$smarty.now|date_format}
{/nocache}

   

上のコードは、キャッシュしたページに現在の日付を出力します。

タグのキャッシュ可能性

個別のタグのキャッシュを無効にするには、そのタグに "nocache" フラグを追加します。

例 15.11. タグの出力をキャッシュ対象外にする


Today's date is
{$smarty.now|date_format nocache}

    

変数のキャッシュ可能性

変数を assign() するときに、キャッシュしないよう指定することができます。 そのような変数を使っているタグは、すべて自動的に非キャッシュモードとなります。

ノート

非キャッシュモードでタグを実行した場合は、そのタグで使われている他のすべての変数が ページをキャッシュから読み込んだときに PHP から新たに代入されることに注意しましょう。

ノート

変数の非キャッシュ設定は、コンパイル済みのテンプレートのコードに影響を及ぼします。 設定を変えた後は、コンパイル済みのテンプレートやキャッシュされたテンプレートを削除して 再コンパイルしなければなりません。

例 15.12. キャッシュしない変数


// $foo をキャッシュしない変数として代入します
$smarty->assign('foo',time(),true);


Dynamic time value is {$foo}

    

プラグインのキャッシュ可能性

プラグインを登録する際にキャッシュ可能なプラグインを宣言する事が出来ます。 registerPlugin() の3番目のパラメータが $cacheable で、デフォルトは TRUE です。

$cacheable=false であるプラグインが登録された時、 プラグインはページがキャッシュから読まれる場合でもページを表示する度に呼ばれます。 プラグイン関数は {insert} 関数に少し似た振る舞いをします。

ノート

$cacheable は、コンパイル済みのテンプレートのコードに影響を及ぼします。 設定を変えた後は、コンパイル済みのテンプレートやキャッシュされたテンプレートを削除して 再コンパイルしなければなりません。

{insert} とは対照的に、プラグインの属性はデフォルトではキャッシュされません。 キャッシュするためには第4パラメータ $cache_attrs によって宣言します。$cache_attrs はキャッシュされるべき属性の名前を格納した配列であり、 プラグイン関数はページがキャッシュから取り出される度に 属性はキャッシュに記述されていたものとして値を取得します。

例 15.13. プラグインの出力がキャッシュされるのを防ぐ


<?php
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

function remaining_seconds($params, $smarty) {
    $remain = $params['endtime'] - time();
    if($remain >= 0){
        return $remain . ' second(s)';
    }else{
        return 'done';
    }
}

$smarty->registerPlugin('function','remaining', 'remaining_seconds', false, array('endtime'));

if (!$smarty->isCached('index.tpl')) {
    // データベースから $obj を取り出して割り当てる
    $smarty->assignByRef('obj', $obj);
}

$smarty->display('index.tpl');
?>

   

index.tpl は次のようになります。


Time Remaining: {remaining endtime=$obj->endtime}

   

たとえページがキャッシュされていても $obj の endtime の秒数までは各ページの表示は変更されていきます。 その後のリクエストでページがキャッシュに書かれている時、 endtime 属性がキャッシュされたのでオブジェクトをデータベースから取り出す必要があるだけです。

例 15.14. テンプレートの一節がキャッシュされるのを防ぐ


index.php:

<?php
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

function smarty_block_dynamic($param, $content, $smarty) {
    return $content;
}
$smarty->registerPlugin('block','dynamic', 'smarty_block_dynamic', false);

$smarty->display('index.tpl');
?>

   

index.tpl は次のようになります。


Page created: {'0'|date_format:'%D %H:%M:%S'}

{dynamic}

Now is: {'0'|date_format:'%D %H:%M:%S'}

... 他にも何か ...

{/dynamic}

   

ページをリロードした時に、両方の日付が異なる点に注意して下さい。 一つは 「動的」 であり、もう一つは 「静的」 です。 {dynamic}...{/dynamic} 間に含まれるコンテンツ全てを動的に生成する事ができ、 残るコンテンツはキャッシュされない事を確認して下さい。

ノート

上の例は、単に動的ブロックプラグインの動作を説明するためだけのものです。 テンプレートセクションのキャッシュ可能性 組み込みの {nocache} および {/nocache} タグを使ってテンプレートセクションのキャッシュを無効にする方法があります。