monoの開発ブログ

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