Rails Action Pack静态页面缓存(actionpack-page_caching gem) github 产品文档中文
README
commit信息: | 提交者:robzolkos | 提交时间:2019-04-26 | 版本:eff182d
actionpack-page_caching
Action Pack静态页面缓存(从Rails 4.0中移出)。
介绍
页面缓存是缓存方法之一,使用它,响应主体会被储存在一些文件中,web服务器可以直接伺服那些文件:
- 一个请求到达E端点。
- 它的响应被计算然后储存在文件F。
- 下次E被请求时,web服务器直接发送F。
这些只会应用于那些200响应码的GET或者HEAD请求,其余的会被忽略。
不像缓存代理或者其它更复杂的设置,页面缓存可显著提高速度,同时十分简单。有着极好的‘开销/收益’。
缓存端点通过web服务器实现短路,web服务器在伺服静态文件方面十分强大,那是有如此性能提升的原因。请求直接到达缓存端点,甚至不会到达Rails应用。
然而,该方法只适用于那些刚好不需要穿过Rails栈的页面。例如,像wiki这样的内容管理系统通常有许多页面,这些页面非常适合该方法,但是,对于那些账户基础系统,人们通常要登录并且操作他们自己的数据,这些系统通常不大可能是候选。Rails贡献者大量使用页面缓存,那是你可以查看的用例。这里是它的源代码。
然而,它不是绝对的,作为权衡,页面中的Javascript仍然可以在这里或者那里动态地调整详情。
安装
向应用的Gemfile
文件里添加这行:
gem "actionpack-page_caching"
然后执行:
$ bundle
使用
开启缓存
页面缓存需要启用缓存:
config.action_controller.perform_caching = true
那通常位于config/environments/production.rb
,但是你可以在任何模式中激活该标记。
从Rails 5开始,那里有一个特殊的开关,不用编辑它的配置文件就可以在development
模式中轻松地‘开启/关闭’缓存。只需执行
$ bin/rails dev:cache
来在development
模式中‘开启/关闭’缓存。
配置缓存目录
默认缓存目录
默认情况下,在Rails应用的public
目录下储存那些文件,并带着匹配的URL路径。
例如,默认情况下,/posts/what-is-new-in-rails-6
的缓存页面请求被储存在public/posts/what-is-new-in-rails-6.html
文件中,并且,web服务器被配置为先在文件系统里检查该路径,然后再后退到Rails。稍后对此进行更多讨论。
定制缓存目录
默认的页面缓存目录可以被覆盖:
config.action_controller.page_cache_directory = Rails.root.join("public", "cached_pages")
当应用引导时,不需要确保该目录存在,如果需要无论何时,页面被缓存,该页面缓存目录会被创建。
定制每个控制器的缓存目录
默认的或者定制的全局配置缓存目录,在每个控制器中都能覆盖它们。下面是做这个的三种方式。
搭配lambda:
class WeblogController < ApplicationController
self.page_cache_directory = -> {
Rails.root.join("public", request.domain)
}
end
symbol:
class WeblogController < ApplicationController
self.page_cache_directory = :domain_cache_directory
private
def domain_cache_directory
Rails.root.join("public", request.domain)
end
end
或者可调用对象:
class DomainCacheDirectory
def self.call(request)
Rails.root.join("public", request.domain)
end
end
class WeblogController < ApplicationController
self.page_cache_directory = DomainCacheDirectory
end
在这种情况下,中间的目录也会根据需求来创建。
缓存actions
通过caches_page
类方法来指定要缓存的actions:
class WeblogController < ActionController::Base
caches_page :show, :new
end
Web服务器配置
该项目的wiki页面有一些配置web服务器的例子。
缓存过期
通过删除缓存文件来处理缓存过期。在缓存端点被命中时,那会造成一个懒再生方法来再次存储该内容。
全部缓存过期
如果缓存被存储在独立的目录中,像是public/cached_pages
,可以通过移除该目录来轻松的过期所有东西。
使用像是rm -rf
命令来递归地移除一个目录是不可靠的,因为该操作不是原子性的,并且会干扰并发页面缓存。
在POSIX系统中,移动文件操作是原子性的,因此,推荐的方式是最好首先把目录移除该路径,然后再递归删除该目录。像下面这样
#!/bin/bash
tmp=public/cached_pages-$(date +%s)
mv public/cached_pages $tmp
rm -rf $tmp
根据之前的提示,如果页面缓存目录不存在,该目录会被创建,因此,移除目录来清理缓存这就足够了,不需要重新创建目录。
细粒度缓存过期
模拟url_for
选项和其成员选项的API:
class WeblogController < ActionController::Base
def update
List.update(params[:list][:id], params[:list])
expire_page action: "show", id: params[:list][:id]
redirect_to action: "show", id: params[:list][:id]
end
end
另外,可以使用Sweepers来过期缓存,为了判断一个缓存什么时间被推测为过期,它会在模型修改上行动。
贡献
- Fork它。
- 创建你的功能分支(
git checkout -b my-new-feature
)。 - 提交你的修改(
git commit -am 'Add some feature'
)。 - 推送到该分支(
git push origin my-new-feature
)。 - 新建一个Pull请求。