2007-04-21 12:13:34 +00:00
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
|
<!-- $Revision$ -->
|
2009-06-14 07:23:39 +00:00
|
|
|
<!-- EN-Revision: 2972 Maintainer: takagi Status: ready -->
|
2007-04-21 12:13:34 +00:00
|
|
|
<!-- CREDITS: mat-sh,daichi,joe -->
|
|
|
|
|
<sect1 id="caching.multiple.caches">
|
|
|
|
|
<title>ページごとに複数のキャッシュ</title>
|
|
|
|
|
<para>
|
|
|
|
|
<link linkend="api.display"><varname>display()</varname></link>
|
|
|
|
|
や <link linkend="api.fetch"><varname>fetch()</varname></link>
|
|
|
|
|
のひとつの呼び出しから、複数のキャッシュファイルを持つ事が出来ます。
|
|
|
|
|
例えば <literal>display('index.tpl')</literal> を呼び出した時、
|
|
|
|
|
いくつかの状況に応じて異なった内容の出力を持っているかもしれず、
|
|
|
|
|
その出力ごとに別のキャッシュを持たせたいと思うかもしれません。
|
|
|
|
|
これは、関数を呼び出す時に第2パラメータとして
|
|
|
|
|
<parameter>$cache_id</parameter> を渡す事で可能です。
|
|
|
|
|
</para>
|
|
|
|
|
<example>
|
|
|
|
|
<title>display() に $cache_id を渡す</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
require('Smarty.class.php');
|
|
|
|
|
$smarty = new Smarty;
|
|
|
|
|
|
|
|
|
|
$smarty->caching = 1;
|
|
|
|
|
|
|
|
|
|
$my_cache_id = $_GET['article_id'];
|
|
|
|
|
|
|
|
|
|
$smarty->display('index.tpl', $my_cache_id);
|
|
|
|
|
?>
|
|
|
|
|
]]>
|
|
|
|
|
</programlisting>
|
|
|
|
|
</example>
|
|
|
|
|
<para>
|
|
|
|
|
上記の例では、<parameter>$cache_id</parameter> として
|
|
|
|
|
<link linkend="api.display"><varname>display()</varname></link>
|
|
|
|
|
に変数 <literal>$my_cache_id</literal> を渡しました。
|
|
|
|
|
それぞれにユニークな <literal>$my_cache_id</literal>
|
|
|
|
|
の値を与える事で、<filename>index.tpl</filename> の別々のキャッシュが生成されます。
|
|
|
|
|
この例では、<parameter>$cache_id</parameter> として使われる
|
|
|
|
|
<literal>article_id</literal> は URL から渡されています。
|
|
|
|
|
</para>
|
|
|
|
|
<note>
|
|
|
|
|
<title>テクニカルノート</title>
|
|
|
|
|
<para>
|
|
|
|
|
クライアント (Web ブラウザ) から Smarty (又はいくつかの PHP アプリケーション)
|
|
|
|
|
に値を渡すときには用心しなくてはいけません。前の例で、URL から article_id
|
|
|
|
|
を扱うのは便利そうにみえましたが、それは悪い結果をもたらすかもしれません。
|
|
|
|
|
<parameter>$cache_id</parameter> はファイルシステムにディレクトリを作成するのに使用され、
|
|
|
|
|
そしてもしユーザーが article_id に極めて大きな値を渡そうとしたり、速いペースでランダムの
|
|
|
|
|
article_id を送信するスクリプトを記述した場合、
|
|
|
|
|
これはサーバレベルの問題を引き起こすかもしれません。必ず、
|
|
|
|
|
値を利用する前に渡されたデータの汚染チェックを行って下さい。おそらくこの例では、
|
|
|
|
|
あなたは article_id が10文字かつ英数字のみで構成され、データベース内に有効な
|
|
|
|
|
article_id が存在しなければならない事を知っています。これをチェックして下さい!
|
|
|
|
|
</para>
|
|
|
|
|
</note>
|
|
|
|
|
<para>
|
|
|
|
|
<link linkend="api.is.cached"><varname>is_cached()</varname></link> と
|
|
|
|
|
<link linkend="api.clear.cache"><varname>clear_cache()</varname></link>
|
|
|
|
|
には、第2パラメータとして同じ <parameter>$cache_id</parameter>
|
|
|
|
|
を渡すようにしましょう。
|
|
|
|
|
</para>
|
|
|
|
|
<example>
|
|
|
|
|
<title>is_cached() に cache_id を渡す</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
require('Smarty.class.php');
|
|
|
|
|
$smarty = new Smarty;
|
|
|
|
|
|
|
|
|
|
$smarty->caching = 1;
|
|
|
|
|
|
|
|
|
|
$my_cache_id = $_GET['article_id'];
|
|
|
|
|
|
|
|
|
|
if(!$smarty->is_cached('index.tpl',$my_cache_id)) {
|
|
|
|
|
// キャッシュが有効でないので、ここで変数の割り当てを行いますn
|
|
|
|
|
$contents = get_database_contents();
|
|
|
|
|
$smarty->assign($contents);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$smarty->display('index.tpl',$my_cache_id);
|
|
|
|
|
?>
|
|
|
|
|
]]>
|
|
|
|
|
</programlisting>
|
|
|
|
|
</example>
|
|
|
|
|
<para>
|
|
|
|
|
<link linkend="api.clear.cache"><varname>clear_cache()</varname></link>
|
|
|
|
|
の第1パラメータとして &null; を渡すと、指定した
|
|
|
|
|
<parameter>$cache_id</parameter> のすべてのキャッシュをクリアすることができます。
|
|
|
|
|
</para>
|
|
|
|
|
<example>
|
|
|
|
|
<title>特定のcache_idの全てのキャッシュをクリアする</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
require('Smarty.class.php');
|
|
|
|
|
$smarty = new Smarty;
|
|
|
|
|
|
|
|
|
|
$smarty->caching = 1;
|
|
|
|
|
|
|
|
|
|
// cache_idが"sports"のキャッシュをすべてクリアする
|
|
|
|
|
$smarty->clear_cache(null,'sports');
|
|
|
|
|
|
|
|
|
|
$smarty->display('index.tpl','sports');
|
|
|
|
|
?>
|
|
|
|
|
]]>
|
|
|
|
|
</programlisting>
|
|
|
|
|
</example>
|
|
|
|
|
<para>
|
|
|
|
|
このように同じ <parameter>$cache_id</parameter> を与える事で、
|
|
|
|
|
キャッシュをまとめて <quote>グループ化</quote> する事が出来ます。
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
</sect1>
|
|
|
|
|
|
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
|
|
|
Local variables:
|
|
|
|
|
mode: sgml
|
|
|
|
|
sgml-omittag:t
|
|
|
|
|
sgml-shorttag:t
|
|
|
|
|
sgml-minimize-attributes:nil
|
|
|
|
|
sgml-always-quote-attributes:t
|
|
|
|
|
sgml-indent-step:1
|
|
|
|
|
sgml-indent-data:t
|
|
|
|
|
indent-tabs-mode:nil
|
|
|
|
|
sgml-parent-document:nil
|
|
|
|
|
sgml-default-dtd-file:"../../../../manual.ced"
|
|
|
|
|
sgml-exposed-tags:nil
|
|
|
|
|
sgml-local-catalogs:nil
|
|
|
|
|
sgml-local-ecat-files:nil
|
|
|
|
|
End:
|
|
|
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
|
|
|
vim: et tw=78 syn=sgml
|
|
|
|
|
vi: ts=1 sw=1
|
|
|
|
|
-->
|