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