作者giive (lala)
看板Ruby
标题[心得] Rails 的 Page Cache
时间Wed Sep 20 16:33:41 2006
出自我的Blog
http://lightyror.blogspot.com/2006/09/rails-cache-page-cache.html
Rails 分为 Page Cache ,Action Cache,Partial Cache
现在就先来讲 Page Cache
首先,将你想 cache 的 page 在 controller 里面加入 caches_page :action_name
class AbcController < ApplicationController
caches_page :index
end
然後确定你的环境底下有 enable cache
Rails 里面 development 环境下是 disable cache ,production 环境下是 enable cache
如果要在 development 下面 enable cache
可以在 config/environments/development.rb 下面
加入
ActionController::Base.perform_caching = true
即可
如此以後你 click 这个页面,他就会帮你 cache 住页面
如果你仔细翻 log 的话
你会发现有这一段
Cached page: /abc.html (0.00062)
然後你发现到 public 底下有一个 abc.html
里面就是你的 cache page
如果是 index action ,他就直接 cache 成 controller 的名字
如果是其他 action ,他就 cache 成 controller_name/action_name.html
像是 ABC controller 的 index action 就 cache 成 public/abc.html
像是 ABC controller 的 go action 就 cache 成 public/abc/go.html
你可能会觉得奇怪,为何他的 cache page 跟其他的 System 的 cache 不太一样
其他系统的 cache 档名可能是 ajbieohhwio.86787e27.87887073 之类
为啥Rails 的这个 page cache 这个那麽的好读
仔细思考一下
当我们 request abc controller 的 index action 时候
大家都是打
http://www.example.com/abc
那麽 lighttpd 接受到这个 request 的时候(这里仅仅指 lighttpd ,其他 web server 不确定)
他会先去 document root 寻找 abc.html
结果他就发现有 abc.html ( cache 的 page ),就立刻 return 回去了
当中完全没有进到 ruby cgi,完全没有 cgi 快慢的问题
所以这是最快的 cache 方式
如果你某种情况要 expire cache
像是修改 db 之後,要将原先的 cache reload
你可以使用
expire_page :action => 'index'
来手动 expire 掉
但是要注意,这种 page cache 没有设定 expire time 的方式
所以说,要嘛就是当经过某些特定的动作时 expire 掉 cache page
要嘛就是跑一个 backend process 去清掉 cache
这个网页有批评这个 page cache 没有 expire 机制根本就没有用
http://www.almaer.com/blog/archives/001214.html
对此我呈反对态度
就举个例子
乐多Blog的作法就很类似
里面我们个人Blog每个页面都是静态 HTML 页面,而非 PHP
每当我们做出一个改变的时候
管理页面就会帮我们产生新的静态页面
这样的作法当然在产生的时候比较慢
但是 show 页面的时候可以达成比任何 CGI 还要快的效率
Cache 好不好用是看你怎麽用,以及什麽情况要用啥方式
而不是设计出一个每个情况都可以用的方式
那只会显得臃肿没意义
--
lighty RoR 是一个介绍 lighttpd , SQLite , Ruby and Rails 的 Blog
http://lightyror.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.108.34