RailsでEtagを使ってブラウザにキャッシュさせる技
さて、いよいよ僕のRuby on Rails覚え書きも、さらに怪しいものになってまいりました。
Railsでアプリケーションを開発していると、パフォーマンスの問題が出てくる時があります。
だいたいは、サーバー側で結果をキャッシュしておくんですが、ブラウザ側のキャッシュを利用することで、サーバーの余計な処理を減らすということも出来るわけです。
この技は、静的ファイルを提供するWebサーバー等は実装されている機能なのですが、動的に作成したリソースをブラウザにキャッシュさせるには自前で実装してあげる必要があります。 ※Rails2.0ではもしかしたら実装されているかもしれませんが・・・僕は知りません。
# キャッシュする必要のあるリソースを取得 resource = Resource.find_by_name('リソース名') # クライアント側のリソースのキャッシュ格納時間を取得する client_cache_time = Time.rfc2822(request.env["HTTP_IF_MODIFIED_SINCE"]) rescue nil # ETagを算出する(リソース固有の値から算出) server_etag = Digest::MD5.hexdigest(resource.unique_id) if client_cache_time and resource.updated_at <= client_cache_time # クライアント側にキャッシュされており、 # かつ # リソースの更新日時よりクライアント側のキャッシュ時間が新しい場合は304を返す render :nothing => true, :status => 304 and return else # クライアント側にキャッシュされていない、 # または # リソースの更新日時よりクライアント側のキャッシュ時間が古い場合はリソースを返す response.headers["Content-Type"] = "text/xml" response.headers['Last-Modified'] = resource.updated_at.httpdate response.headers['ETag'] = "#{server_etag}" render_text resource.body and return end
だいたい、こんな感じです。 画像とかに使ってあげると、多分パフォーマンスアップするんじゃないでしょうかね?