morolicious開発日記

MojoliciousとBootstrapで作られているレスポンシブなエロサイト「morolicious」の開発記録を綴りっています

サイドバーコンテンツをキャッシュ化して描写を高速化

このエントリーは古い内容が含まれています。
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;
      .....;
    }
  );

....
}