代码之家  ›  专栏  ›  技术社区  ›  JP Richardson

Rails缓存-XML文件?

  •  3
  • JP Richardson  · 技术社区  · 16 年前

    我的Rails应用程序正在虚拟机上运行。使用静态页面时,虚拟机的性能很好。事实上,我正在运行另一个使用Apache虚拟主机的站点,它只提供静态HTML文件,响应是足够的。但是,动态生成XML文件的Rails应用程序响应非常慢。实际上,每个XML文件大约需要10秒左右的时间。Rails生成的这些XML文件一天更改不超过一次。

    配置要缓存的这些XML文件的最佳实践是什么?

    编辑1:

    我应该提到,浏览器不会查看这些XML文件。移动应用程序在“field”中查看它们,因此,不幸的是,发送“http/1.0 304 not modified”将不起作用。

    编辑2:

    如果重要的话,我正在使用phulsion passenger来托管我的Rails应用程序。

    2 回复  |  直到 16 年前
        1
  •  7
  •   kch    16 年前

    如果您使用Rails的静态页面缓存并通过Apache提供服务,那么只要在URL上使用一个显式的XML扩展就可以了。

    如果只提供XML而不提供HTML,那么在查找缓存文件时,也可以将apache conf编辑为默认的XML而不是HTML。

    缓存到期对于代码和测试来说是一件很无聊的事情,但是由于很少重新生成文件,所以可能会使整个缓存到期。


    以下是我在一个很少更新的小Rails站点中处理缓存的文件和摘录:

    在要缓存的控制器中

    class XmlThingController < ApplicationController
      caches_page :index, :show, :other_actions
    

    在修改将导致XML更改的数据的控制器/操作中:

    class Admin::SomeCrudController < AppplicationController
      cache_sweeper :stupid_master_sweeper, :only => [ :save, :destroy ]
    

    在“config/environments/production.rb”中

    config.action_controller.page_cache_directory = 
      File.join(RAILS_ROOT, 'public', 'cache')
    

    在您的vhost apache conf中:

    # 1.4. Handle caching
    
    # 1.4.1. prevent direct cache access
    RewriteRule  ^/cache - [F,L]
    
    # 1.4.2. for index
    RewriteCond  %{DOCUMENT_ROOT}/cache/index.html -f
    RewriteRule  ^/?$ /cache/index.html [L]
    
    # 1.4.3. for explicitly specified extensions
    RewriteCond  %{DOCUMENT_ROOT}/cache%{REQUEST_URI} -f
    RewriteRule  ^(.*)$ /cache$1 [L]
    
    # 1.4.4. with html extension implied
    RewriteCond  %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f
    RewriteRule  ^(.*)$ /cache$1.html [L]
    
    
    # 1.5. Finally, proxy everything else to mongrel
    RewriteCond  %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
    RewriteRule  ^/(.*)$ balancer://your-website-proxy%{REQUEST_URI} [P,QSA,L]
    

    每次触发缓存时清理整个缓存的哑扫描程序:

    class StupidMasterSweeper < ActiveRecord::Observer
      observe Foo, Bar # All models that affect caching here
    
      def after_save(record); end
      def after_destroy(record); end
    
      def filter(controller)
        # sweep everything.
        `cd #{RAILS_ROOT} && RAILS_ENV=#{ENV['RAILS_ENV']} rake cache:clear`
      end
    end
    

    lib/tasks/cache.rake

    namespace :cache do 
    
      desc "Remove all cached files" 
      task :clear do
        puts `rm -rf #{RAILS_ROOT}/public/cache/*`
      end 
    
    end 
    

    如果您希望将默认的隐含扩展名默认为XML,请更改1.4.2索引规则的扩展名,并执行以下操作:

    # 1.4.4. with html extension implied
    RewriteCond  %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f
    RewriteRule  ^(.*)$ /cache$1.html [L]
    

    到:

    # 1.4.4. with xml extension implied
    RewriteCond  %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.xml -f
    RewriteRule  ^(.*)$ /cache$1.xml [L]
    
        2
  •  0
  •   karim79    16 年前

    发送一个 "HTTP/1.0 304 not modified" 请求XML文档时,客户端的HTTP状态代码。