Rails Caching - XML-файлы? - PullRequest
       10

Rails Caching - XML-файлы?

3 голосов
/ 01 апреля 2009

Приложение My Rails работает на виртуальной машине. Производительность виртуальной машины просто отлично со статическими страницами. Фактически, я управляю другим сайтом, использующим виртуальный хостинг Apache, который просто обслуживает статические HTML-файлы, и ответ адекватный. Однако мое Rails-приложение, которое динамически генерирует XML-файлы, реагирует очень медленно. Фактически, для каждого файла XML требуется около 10 секунд. Эти XML-файлы, которые генерирует Rails, меняются не чаще одного раза в день.

Как лучше настроить эти файлы XML для кэширования?

Редактировать 1:

Я должен отметить, что эти XML-файлы не просматриваются браузером. Они просматриваются мобильными приложениями в «поле». Так что, к сожалению, отправка «HTTP / 1.0 304 не изменена» не будет работать.

Редактировать 2:

Если это имеет значение, я использую Phusion Passenger для размещения своего приложения на Rails.

Ответы [ 2 ]

7 голосов
/ 01 апреля 2009

Если вы используете статическое кэширование страниц в rails и работаете через apache, достаточно использовать явное расширение xml для URL.

если вы работаете только с xml и не используете html, при поиске кешированных файлов вы также можете изменить для apache conf значение по умолчанию xml вместо html.

срок действия кэша - довольно скучная вещь для кодирования и тестирования, но, поскольку вы редко регенерируете файлы, вы можете просто удалить весь кэш.


Вот урезанный выбор файлов и выдержки из того, как я обрабатываю кеш на небольшом, редко обновляемом сайте rails:

В контроллерах, которые вы хотите кэшировать

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

В контроллерах / действиях, которые изменяют данные, которые могут вызвать изменения в xmls:

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

В 'config / средах / 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]
0 голосов
/ 01 апреля 2009

Отправка «HTTP / 1.0 304 без изменений» HTTP-кода состояния клиенту при запросе XML-документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...