浩文 联系 关于本站 登录 注册
  • 关注新浪微博:
  • 关注微信公众号:

Rails Action Pack静态页面缓存(actionpack-page_caching gem) github 产品文档中文

README

commit信息: | 提交者:robzolkos | 提交时间:2019-04-26 | 版本:eff182d

actionpack-page_caching

Action Pack静态页面缓存(从Rails 4.0中移出)。

介绍

页面缓存是缓存方法之一,使用它,响应主体会被储存在一些文件中,web服务器可以直接伺服那些文件:

  1. 一个请求到达E端点。
  2. 它的响应被计算然后储存在文件F
  3. 下次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来过期缓存,为了判断一个缓存什么时间被推测为过期,它会在模型修改上行动。

贡献

  1. Fork它。
  2. 创建你的功能分支(git checkout -b my-new-feature)。
  3. 提交你的修改(git commit -am 'Add some feature')。
  4. 推送到该分支(git push origin my-new-feature)。
  5. 新建一个Pull请求。

代码状态