プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

「RailsによるアジャイルWebアプリケーション開発」21章読了

aroundフィルタでアクションにかかった時間を計測する

products_controller.rbに以下のコードを追加。

  around_filter :time_an_action

  def time_an_action
    started = Time.now
    yield
    elapsed = Time.now - started
    logger.info("#{action_name}#{elapsed}秒かかりました")
  end

でlog/development.logを見てみると、

Processing ProductsController#index (for 127.0.0.1 at 2008-07-24 10:10:34) [GET]
  Session ID: BAh7ByIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo
SGFzaHsGOgtub3RpY2UiJlByb2R1Y3Qgd2FzIHN1Y2Nlc3NmdWxseSB1cGRh
dGVkLgY6CkB1c2VkewY7BlQ6DGNzcmZfaWQiJTY2YjhjZjM1YTM2MWFlOTYz
MmI2ODBjZWZiMWE3YzQ4--fff8ffb3b2a1277a2e8e7c0039f93bd81d9a2959
  Parameters: {"action"=>"index", "controller"=>"products"}
  Product Load (0.002042)   SELECT * FROM "products" 
Rendering template within layouts/products
Rendering products/index
indexは0.032974秒かかりました
Completed in 0.03367 (29 reqs/sec) | Rendering: 0.01157 (34%) | DB: 0.00204 (6%) | 200 OK [http://localhost/products]

おー。ちゃんとログに出てますね。

WEBrickとページキャッシュ

Railsとはあまり関係ないですね。どっちかっていうとWebサーバのお話し。
静的コンテンツをWebサーバにキャッシュさせて、Railsを起動することなく、Webサーバ折り返しで返せるので速いよっていうこと。
WEBrickのコンソールログを見ていると、キャッシュなしの場合は200 OKで返して、キャッシュありのばあいは、304 Not Modifiedで返しているようです。


条件はこんな感じ。

  • http://localhost:3000/images/rails.pngにアクセスする
  • ブラウザのキャッシュはオフとする(0MBに設定)
  • fasterfoxを入れて、ブラウザの右下に表示されるレスポンスタイムを計測値とする
  • キャッシュありなしそれぞれ10回ずつの平均をとる

キャッシュなしの平均: 322[msec]
キャッシュありの平均: 278[msec]

というわけで、当然ながらキャッシュありの方が速いですね。

アクションキャッシュ

動的コンテンツもキャッシュできますよ。というのがこのアクションキャッシュ。


開発環境では(本番環境以外では)キャッシュはデフォルト無効なので、
config/environments/development.rbを、

config.action_controller.perform_caching             = true 

とする。


products_controller.rbに以下のコードを追加。

caches_page :slow_action
 
  def slow_action
    sleep 5

    render(:text => 'Slow aciton is finished.')
  end

  def expire_cache
    expire_page :action => "slow_action", :id => params[:id]
    
    render(:text => 'Slow aciton\'s cache is cleared.')
  end


早速slow_actionにアクセスしてみる。
http://localhost:3000/products/slow_action/1

5.231[sec]かかっている。


で、もう一度同じslow_actionにアクセスしてみる。

今度はキャッシュされているので、0.351[sec]しかかからなかった。


このままだと、キャッシュされっぱなしで、
内容が変更になっても古い内容が表示されつづけるので、
キャッシュを無効にする必要がある。
そのためには、expire_cacheにアクセスする。
http://localhost:3000/products/expire_cache/1


これでキャッシュがクリアされたので、
もう一度slow_actionにアクセスすると、5秒近くかかるはず。

GETリクエストの問題点

健全なWebのための警告として、

破壊的なアクションはすべてPOSTリクエストに

と書いてありますが、RESTfulな観点からいうと違いますね。。
削除はDELETEリクエストにすべきですし、更新はPUTリクエストにすべきでしょう。
まあ、この本が書かれた時と、今では状況が違うのでしょうが。