2006/09/25

TTでFragment Cache(2)

やってみると、簡単であった。。。
書式的に直感的じゃないところがあるけれど、今回はこれでいいのではという。。。

Perl:

use Cache::Memcached;

sub partial_cache_filter {
my($context, $key, $ttl)=@_;

$key = join("::", __PACKAGE__, 'partial_cache_filter', $context->stash->get('component')->name, $key);
return sub {
my $text=shift;
my $cache = Cache::Memcached->new(...init....);

my $content;
unless( $content = $cache->get($key) ){
$content = $context->stash->get($text);
$cache->set($key, $content, int($ttl) || 30*60);
warn "$key was saved.";
}
return $content;
}
}

use Template;
my $tmpl = Template->new;
$tmpl->add_option(
FILTERS => { partial_cache => [\&partial_cache_filter, 2] },
);



TT:

[% MACRO parts1 BLOCK %]

    [% FOREACH i = list1 %]
  • [% i %]

  • [% END %]

[% END %]

[% # 1800秒間、parts1の内容をキャッシュ。%]
[% 'parts1' | partial_cache(cache_key1, 1800) %]

これで、部分的にページの一部だけを切り分ける需要には耐えられるはず。PROCESS とか INCLUDE とかのdirectiveを拡張できれば、最後みたいなわけのわからない書き方をせずにすんだのに。もしくは、FILTER が出力時だけじゃなくて、入力時にも割り込めればもっと分かりやすい書き方ができるのに、とかいろいろ不満はありますがこのあたりで妥協しておきます。。

キャッシュしたい部分を、partial_cache() を呼び出す前までにMACROで囲っておかないといけないあたりは、先日説明したとおりの理由からです。

工夫って言えそうな点は、

$context->stash->get('component')->name;

を使って、テンプレートごとに自動的にキャッシュの名前空間を切り分けるようにした所くらいか。。。

ラベル: ,


Comments: コメントを投稿



<< Home

This page is powered by Blogger. Isn't yours?