「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リクエストにすべきでしょう。
まあ、この本が書かれた時と、今では状況が違うのでしょうが。