第8回 Smartyの便利な機能を使いこなす(その2:キャッシュ後編) - Smarty講座

PHP基礎編

yossy先生のSmarty講座

Lecutures on PHP

第8回 Smartyの便利な機能を使いこなす(その2:キャッシュ後編) (その2)

 このエントリーをはてなブックマークに追加

部分キャッシュの強い味方、{insert}関数

yossy先生{insert}も{include}と同様に、指定位置に別の表示結果を埋め込みます。

ただ大きく違う点があり、{include}は別のテンプレートファイルを埋め込んだのに対し、{insert}はPHPで定義した関数の実行結果を埋め込みます。

そして{insert}で出力された部分は{include}と異なり、キャッシュに含まれないという特徴があります。

{insert name="getSidemenu"}

{include}ではfileという属性でテンプレートファイルを指定していましたが、{insert}ではnameという属性に関数を指定します。ここで指定した値の先頭に"insert_"を付与した関数が呼び出されます。

上記の例ではinsert_getSidemenu()という関数が呼ばれ、その実行結果が埋め込まれます。

また{include}と同様に、パラメータを渡すことが出来ます。

{insert name="getSidemenu" title="さいどめにゅー"}

ではinsert_getSidemenu()を定義してみましょう。(*1)

function insert_getSidemenu($params$smarty)
{
    return 
'<div id="sidemenu">...</div>';
}

戻り値でHTMLの文字列を返しています。この値がテンプレートで{insert}を記述した箇所に埋め込まれます。(*2)

そして{insert}で埋め込まれた値はキャッシュに含まれません。
したがって、例えばアクセスされるごとに表示する値を動的に変えたい場合などキャッシュされたら困る箇所に用いると効果的です。

さて、insert_*** 関数は2つの引数を持ちます。
第1引数には{insert}で渡されたパラメータを連想配列で受け取ることが出来ます。

上記の例では$paramsに以下の連想配列が渡されます。

array('name' => 'getSidemenu', 'title' => 'さいどめにゅー')

そして第2引数にはSmartyオブジェクトが渡されます。

上記の例ではreturn文に直接HTMLを書いてしまっていますが、これではせっかくのテンプレートエンジンが台無しなので、 以下のように直してみます。

function insert_getSidemenu($params$smarty)
{
    
$smarty->assign('title'$params['title']);
    return 
$smarty->fetch('sidemenu.tpl');
}

そして、テンプレートを1つ追加します。

sidemenu.tpl

<h2>{$title}</h2>
<
div id="sidemenu">
  (
サイドメニューの内容
</
div>

yossy先生さて、ここでまたfetch()という見慣れないメソッドが出てきました。

fetch()メソッドはdisplay()メソッドと同様に、引数で指定したテンプレートを解析します。
異なる点は、display()はテンプレートの内容を出力していますがfetch()は出力はせず、テンプレートの内容を戻り値として返します。

従って、上記の例ではsidemenu.tplの内容をfetch()で取得してそれをinsert_getSidemenu()の戻り値として返しています。
結果として{insert}の位置にsidemenu.tplの内容が埋め込まれます。

そしてもう一つ重要なポイント。fetch()メソッドもdisplay()メソッドと同様に、テンプレートの内容がキャッシュされます。
つまり、{insert}の内容を複数のページにまたがってキャッシュさせることが可能になる、というわけです。

※クリックすると拡大表示されます。

以上、キャッシュについての説明はここまでにしたいと思います。

yossy先生「Smartyの処理は遅い」と言われることが時々あるのですが、今回説明したキャッシュなどの仕組みをちょっと工夫して使うことでパフォーマンスが改善することもありますので、是非もう一度、改善の余地がないか手元のソースを見直してみてください。

また今回は説明しませんでしたが、キャッシュの方法を拡張する仕組みとして、「キャッシュハンドラ」というものがあります。
これはキャッシュ管理の手段として、データベース(*3)やmemcached(*4)などを用いられるようにするための仕組みです。

サイトのページ数が多く、キャッシュファイルの数が膨大になり管理が煩雑になったりパフォーマンスが落ちるといった場面や、大規模サイトで複数のWebサーバー上でSmartyを使い、キャッシュを複数サーバー間で共通管理したい場面などで有効活用出来ると思いますので、興味のある人は是非チャレンジしてみてください。

さて次回はフィルタについて説明したいと思います。

----
(*1) 関数を定義したファイルを別途作成した場合、{insert}のscript属性でファイルを指定し読み込むことが出来ます。詳細は{insert}のマニュアルを参照してください。
(*2) {insert}にassign属性を設定すると、出力されず指定のテンプレート変数に保持されます。
しかし、キャッシュが有効な時はその値をテンプレート上で利用することが出来ないので、あまり意味がないかもしれません。
(*3) http://www.phppro.jp/phpmanual/smarty/section.template.cache.handler.func.html
(*4) http://swag.dk/swag/kode/

  • 1
  • 2
  • yossy先生

本名:吉武 正史

パッケージ系ソフトウェア会社で、自然言語処理系の研究やWebアプリケーション、検索連動型広告などの開発に従事。 2006年末にフリーランスとして独立し、現在はPHPによるWeb開発の業務を中心に、コンサルティングや執筆活動などを展開。
サイトURL:http://freeative.jp/

ご意見・感想フォーム

今回の「yossy先生のSmarty講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

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