キャッシュ可能なプラグインの出力の制御 (キャッシュ) - PHPプロ!マニュアル

Smartyマニュアル

キャッシュ - キャッシュ可能なプラグインの出力の制御

キャッシュ可能なプラグインの出力の制御

Smarty 2.6.0 から、プラグインを登録する際にキャッシュ可能なプラグインを宣言する事が出来ます。 register_block() register_compiler_function() および register_function() の第3パラメータは $cacheable と呼ばれ、デフォルトは TRUE です。この時、Smarty 2.6.0 以前のプラグインの振る舞いになります。

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

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

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

<?php
$smarty
->caching true;

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

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

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

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

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

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

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

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

index.php:

<?php
$smarty
->caching 1;

function 
smarty_block_dynamic($param$content, &$smarty) {
    return 
$content;
}
$smarty->register_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" であり、もう一つは "static" です。 {dynamic}...{/dynamic} 間に含まれるコンテンツ全てを動的に生成する事ができ、 残るコンテンツはキャッシュされない事を確認して下さい。



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報