サイドバーコンテンツをキャッシュ化して描写を高速化
このエントリーは古い内容が含まれています。
Mojolicious 4.0がリリースされました - サンプルコードによるPerl入門
特に大きな変更として、render_data, render_json, render_partial, render_textメソッドがMojolicious::Controllerから取り除かれているので、この部分を変更する必要があります。$c->render(data => '...')という形式に書き換える必要があります。
-
-
- 以下本分
-
moroliciousのサイドバーにある「関連語」リストが意外と描写に時間が掛かるので、師匠のページを参考にキャッシュを試してみる。
変数の値はアプリ終了まで永続されるのでそれを使ったもの。うちのアプリはとある事情で数時間ごとにrestartされる仕組みなので、問題ないけど、通常は$html_sidebarの中身が更新されないので注意。
MyApp/Web.pm
sub startup { .... # sidebar html cache my $html_sidebar; $self->hook( before_dispatch => sub{ my $self = shift; unless ($html_sidebar) { $html_sidebar = $self->render_partial('/layouts/sidebar'); } $self->stash->{html_sidebar} = $html_sidebar; } ); .... }
※師匠のページにはrender_partial が render_partical とtypoがあるので注意。
※Mojolicious 4.0ではrender_partialは無くなっています。$self->render('mail', partial => 1);とする必要があります。http://mojolicio.us/perldoc/Mojolicious/Guides/Rendering#Rendering_data
$self->stash->{html_sidebar} = ... とする事で、テンプレートからは $html_sidebar で使える。templateの方はこんな感じで書けば $html_sidebarが展開されてHTMLが描写される。
<div id="main-content"> <!-- contents --> <%= content %> </div> <div id="sidebar-content"> <!-- side bar --> <%= $html_sidebar %> </div>
気づいた点
実はhookのbefore_dispatchを他にも使っているのだけれど、ちゃんと動作するみたい。
sub startup { .... # hook1 $self->hook( before_dispatch => sub{ my $self = shift; .....; } ); # hook2 $self->hook( before_dispatch => sub{ my $self = shift; .....; } ); .... }
で、こんなふうにしてみたんだけどこっちはダメっぽい。
sub startup { .... $self->hook( # hook1 before_dispatch => sub{ my $self = shift; .....; }, # hook2 before_dispatch => sub{ my $self = shift; .....; } ); .... }