2009-08-09 2 views
2

Ich habe eine Aktion, die ich über Cache-Wie bekomme ich caches_action, um Verfalls-Header zu setzen, wenn es einen Treffer in memcached gibt?

caches_action :my_action, :expires_in=>1.hours 

und stellte auch die Header in der Aktion gültig bis sich

def my_action 
    ... 
    expires_in 1.hours 
    send_data(...,:disposition => 'inline',:type => 'image/png',:filename => params[:title]+".png") 
end 

jedoch verwenden, wenn ich an der Steuer-Antwort-Header-Cache aussehen von einem Ergebnis, dass als Ergebnis eines memcached-Hit kommt, bekomme ich diese:

Cache-Control: private, max-age=0, must-revalidate 

Das erste Mal rund, das heißt, wenn nichts im Cache ist, ist es wha t Ich gehe davon aus, d.h .:

Cache-Control: max-age=3600, private 

Es ist wie Schienen + Memcached sieht weder die Original-Response-Header das Caching, noch Setzen entsprechender Header selbst. Das Ergebnis ist, dass der Client jedes Mal eine Anforderung an den Server stellt, auch wenn sich das Ergebnis (ein Bild) nicht geändert hat. Obwohl die Aktion schnell beendet wird, wenn sie im Cache gelandet wird, werden immer noch alle Daten erneut gesendet, was ich vermeiden möchte.

Wie bekomme ich die Header, um das Richtige zu tun, so dass der Client entweder überhaupt keine Anfrage macht oder eine "nicht modifizierte" Antwort bekommt?

Antwort

0

Stellen Sie sicher, dass Ihre Umgebung so konfiguriert ist, dass sie das Caching unterstützt. So in config/Umgebungen/development.rb (oder wo auch immer), sollten Sie sehen:

config.action_controller.perform_caching = true 

Auch der private Cache-Tag erzählt Zwischen Cache-Server nicht um den Inhalt zu speichern. Dies ist standardmäßig sicher. Wenn Sie dieses Verhalten ändern möchten, setzen Sie einfach Ihren Cache wie folgt aus:

expires_in(1.hours, :private => false, :public => true) 

Um teure Verarbeitung auf dem Server zu überspringen, wenn der Inhalt nicht verändert hat, zu verwenden:

if stale?(:etag => @model, :last_modified => @model.updated_at.utc) 
    # Expensive stuff in here. 
    respond_to do |format| 
    ... 
    end 
end 
+0

ja Caching ist eingerichtet und funktioniert OK - das Problem ist die zweite gehen, wenn es einen Treffer im Memcache gibt, die Header nicht gesetzt werden. Auch beim zweiten Durchlauf würde die Aktion wegen des Treffers in Memcache nicht aufgerufen werden, so dass das dritte Codefragment keine Auswirkung hat. – frankodwyer

+0

Oh, ich verstehe. Ich hatte dein Problem in die falsche Richtung. Das ist merkwürdig. Können Sie die relevanten Fragmente der Protokolle veröffentlichen? – askegg

+0

Gemäß diesem Post nimmt Rails möglicherweise ein HTML-Dokument an, daher stimmt der Schlüssel möglicherweise nicht mit Ihrer Anfrage überein. Nur ein Gedanke. http://gilesbowkett.blogspot.com/2007/07/little-rails-image-caching-caveat.html – askegg

2

hatte ich die genau dasselbe Problem vor ein paar Tagen. Beim Debuggen scheint rails die expires_in für caches_action nicht zu berücksichtigen.

Was ich gefunden habe, ist das gleiche in einen cache_path zu setzen. Zum Beispiel insted

caches_action :monthly_sales_by_category, :expires_in => 10.minutes, :cache_path => proc { |c| 
    category = c.params[:category] 
    {:cat => category} 
} 

tun, was ich tat

caches_action :monthly_sales_by_category, :cache_path => proc { |c| 
    expires_in 10.minutes, :public => false 
    category = c.params[:category] 
    {:cat => category} 
} 

folgende war und wirkt wie ein Zauber. :)

+0

Danke, danke, danke, dass du dich damit beschäftigt hast. – Graeme