Ramazeのレンダリング結果をキャッシュしてApacheだけで高速に処理する
以前にも同じ内容のことを書きましたが、Ramazeのバージョンが上がってコードが通らなくなっているので再度。二度目以降のアクセスはすべてApacheのみで処理され、プログラムは起動しないため高速に結果を返すことが可能です。Ramaze-2010.03で動作確認しています。
実装
cache.rb
module Innate class Action unless method_defined?(:original_render) # renderメソッドのエイリアスを作成 alias_method :original_render, :render end
def render # オリジナルを呼び出す body = original_render
# エラーだった場合はキャッシュしない if instance.response.status == 200 # レンダリング結果をファイルに保存 # full_pathでURIのパスが得られるので利用している dir = "cache#{full_path}" FileUtils.mkdir_p(dir) unless File.exist?(dir) open("#{dir}/index.html", 'w') do |f| f << body end end
# オリジナルの結果を返す body end endend
見ての通り内部のメソッドを書き換えていてかなり強引なコードです。正しい手法が分かる方がいたらぜひ教えて欲しいです。
.htaccess
# キャッシュディレクトリにキャッシュが生成されていればそちらを返すRewriteCond %{DOCUMENT_ROOT}/cache%{REQUEST_URI}/index.html -fRewriteRule ^(.*)$ cache/$1/index.html [L]# キャッシュが存在しない場合はスクリプトを起動RewriteRule ^(.*)$ dispatch.cgi/$1 [QSA,L]
キャッシュの削除はcronなんかを使って適当なタイミングでやればいいんじゃないでしょうか。
追記:2010/03/28エラーだった場合はキャッシュしないように変更