monolithic kernel

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
end
end

見ての通り内部のメソッドを書き換えていてかなり強引なコードです。正しい手法が分かる方がいたらぜひ教えて欲しいです。

.htaccess

# キャッシュディレクトリにキャッシュが生成されていればそちらを返す
RewriteCond %{DOCUMENT_ROOT}/cache%{REQUEST_URI}/index.html -f
RewriteRule ^(.*)$ cache/$1/index.html [L]
# キャッシュが存在しない場合はスクリプトを起動
RewriteRule ^(.*)$ dispatch.cgi/$1 [QSA,L]

キャッシュの削除はcronなんかを使って適当なタイミングでやればいいんじゃないでしょうか。

追記:2010/03/28エラーだった場合はキャッシュしないように変更