monolithic kernel

Ramazeでレンダリング結果をファイルにキャッシュする

mod_rewriteを使ってCGI環境で超高速にキャッシュを返す」という記事を読んで、Ramazeで同じことをやろうとしたら結構困ったのでメモしておきます。ちなみに、Ramazeに標準で用意されているキャッシュはメモリ上にキャッシュするものなので、CGIでは使えません。

キャッシュを生成するためにはレンダリング結果のHTMLが必要なわけですが、Ramazeにはレンダリング結果を読んだり書いたりする方法は(たぶん)用意されていません。そのため、Ramaze内部のレンダリングを行っているメソッドを上書きして強引にデータを読み取ります。

module Ramaze
  class Action
    unless method_defined?(:static_html_original_render)
      alias_method :static_html_original_render, :render
    end

    def render
      # オリジナルのレンダリング処理を呼び出す
      content = static_html_original_render
      # ここで適当に content の内容を保存
      # full_pathでリクエストのパスがとれるのでこれを使うとよいです
      # オリジナルと同じ値を返す
      content
    end
  end
end

あとは冒頭で挙げた記事にあるように、.htaccessで制御、cronで古いキャッシュの削除を行えばOKです。