2009-04-01 13 views
3

Meine Rails-Anwendung wird auf einer VM ausgeführt. Die Leistung der VM ist bei statischen Seiten in Ordnung. Tatsächlich betreibe ich eine andere Seite mit dem virtuellen Apache-Hosting, das nur statische HTML-Dateien bereitstellt, und die Antwort ist angemessen. Meine Rails-Anwendung, die XML-Dateien dynamisch generiert, reagiert jedoch sehr langsam. In der Tat dauert es ungefähr 10 Sekunden oder so für jede XML-Datei. Diese XML-Dateien, die Rails generiert, ändern sich nicht mehr als einmal am Tag.Rails Caching - XML-Dateien?

Was ist die beste Vorgehensweise, um diese XML-Dateien so zu konfigurieren, dass sie zwischengespeichert werden?

Edit 1:

sollte ich erwähnen, dass diese XML-Dateien werden von einem Browser angezeigt. Sie werden von mobilen Anwendungen im "Feld" angezeigt. Das Senden von "HTTP/1.0 304 not modified" funktioniert leider nicht.

Edit 2:

Wenn es darauf ankommt, bin ich mit Phusion Passagier meine Rails-Anwendung hosten.

Antwort

7

Wenn Sie Schienen statische Seiten-Caching und dazu dient, durch Apache verwendet wird, nur auf die Urls eine explizite XML-Erweiterung verwenden würde es tun.

wenn Sie nur xml dienen und keine HTML Sie könnten auch die Apache conf bearbeiten, um XML statt HTML auf Standard, wenn für Cache-Dateien suchen.

Cache Ablauf ist eine ziemlich langweilige Sache zu Code und Test, aber da Sie selten die Dateien zu regenerieren, können Sie nur den gesamten Cache ablaufen.


Hier ist eine getrimmte Auswahl von Dateien und Auszügen aus wie ich Cache in einer kleinen, nur selten aktualisiert Schienen Website handhaben:

In dem Controllern Sie

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

In den Controllern gecached werden sollen/Aktionen, die Daten ändern, die Änderungen an den xmls verursachen würden:

In '

config/Umgebungen/production.rb‘
config.action_controller.page_cache_directory = 
    File.join(RAILS_ROOT, 'public', 'cache') 

Somehere in Ihrem 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] 

Die stummen Kehrmaschine, dass jedes Mal, wenn es ausgelöst, dass ganze Cache reinigt:

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 

Wenn Sie es vorziehen, die Standard implizierten Erweiterung xml auf Standard, auf dem 1.4 die Erweiterung ändern.2 Index-Regel und die folgende:

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

zu:

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

... sobald ich spiele dony mit Cornify. – kch

+0

Interessante Lösung. Sound einfach genug. Was ist mit "rails 'static page caching" gemeint, dass ein Juwel oder etwas? Oder ist das in Rails eingebaut? –

+1

Es ist eingebaut, siehe caches_page in der aktualisierten Antwort. – kch