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エラーだった場合はキャッシュしないように変更