Bestimmten Cache zu bestimmter Zeit leeren

Hallo,

ich möchte den Cache eines bestimmten Produktes um eine bestimmte Zeit leeren, sobald die Kategorieseite mit dem Produkt oder die Detailseite des Produkts nach dieser Zeit also aufgerufen wird, solle inmalig der Cache geleert werden.

Wie bekomme ich das hin? Hat jemand ne Idee?

Ich könnte natürlich ein Event abonnieren und dort den HTTP Cache invaliditieren. Allerdings wird der PHP Code ja gerade nicht ausgeführt, wenn die Seite gecacht wird. Gibt es ein Event, das immer ausgelöst wird?

LG und einen schönen restlichen Sonntag.

Hi,

du musst einen BAN-Request mit x-shopware-cache-id Header senden. Darin steht dann bspw. “a13” für Artikel 13, vgl. Understanding the Shopware HTTP Cache

Warum möchtest du den Artikel überhauptinvalidieren? Durch die automatische Invalidierung bei Änderungen sollten Lagerbestände, Preise etc automatisch zu einer Invalidierung des Caches führen.

Besten Gruß,

 

Daniel

Das ist soweit klar. Das möchte ich allerdings zu einer bestimmten Uhrzeit anstoßen lassen, also z.B. beim Seitenaufruf prüfen, ob dieser Zeitpunkt bereits überschritten wurde und dann den Cache invaliditieren.

Es geht um eine Countdownfunktion, die größere Eingriffe in die Artikelstruktur vornimmt, z.T. werden einige Smarty Variblen überschrieben. Wenn dieser Zeitpunkt des Countdownendes überschritten ist, ändert sich das wieder und ich möchte genau zu diesem Zeitpunkt den Cache der betroffenen Produkte einmal leeren.

Beste Grüße!

Hi,

alles klar. Dann kannst du (wie oben beschrieben) mit CURL oder ähnlichem einen Request gegen deinen Shop machen und den Cache für den fraglichen Artikel invalidieren, indem du den besagten Header setzt. Das kannst du dann ja auch via Cronjob machen.

Daniel

Hallo Daniel,

vielen Dank für das schnelle Feedback. 

Ja, dieses Vorgehen hatte ich auch als Option auf dem Schirm.

Allerdings würde ich das gerne beim Aufruf der Seite machen. Gibt es irgendein Event, an das man sich hängen könnte, das bei jedem Seitenaufruf, also auch bei den gecachten Seiten gefeuert wird?

Danke!

Hi,

nein, es gibt für gecachte Seiten keine Events - du könntest dich aber an dem refreshStatistics-Call hängen, der wird als Ajax-Requesta bei jedem Seitenaufruf abgesetzt, auch bei gecachten Seiten. Damit würde es auch gehen.

Daniel

1 „Gefällt mir“

Perfekt, genau das habe ich gesucht.

Kompetent und super schnell wie immer, ich danke!

Hallo [@Daniel Nögel](http://forum.shopware.com/profile/4010/Daniel Nögel „Daniel Nögel“)‍

jetzt bräuchte ich nochmal kurz deine Hilfe. Habe gerade auf 5.2.12 geupdatet, jetzt funktioniert das nicht mehr. Der Cache wird auch nicht mehr invaliditiert wenn ich den Artikel im Backend speichere. 

In den Change Logs kann ich aber keine Veränderung diesbezüglich finden!

Das kann eigentlich nur am Update liegen. 

Beste Grüße

Hi,

schwer zu sagen. Gibt es diesbezüglich Fehler im Log? Häufig sowas wie „Proxy returned invalid status code…“ oder ähnlich. Ist die automatische Cache-Invalidierung in den Cache-Einstellungen noch aktiv?

Besten Gruß,

Daniel

Hallo Daniel,

ja die automatische Cache-Invalidierung ist aktiviert, Einträge im Log konnte ich nicht feststellen.

Habe vom Shopware Support mittlerweile sogar eine Antwort erhalten:

Bei dem von Ihnen geschilderten Problem handelt es sich um ein bekanntes Problem. Sie müssen im Backend im Bereich „alternative Proxy Url“ die IP Ihres Servers eintragen. Dieses Problem wird mit 5.2.13 gefixt. 

Dort die IP Adresse einzutragen löst leider das Problem nicht.

LG

@Daniel Nögel schrieb:

Hi,

nein, es gibt für gecachte Seiten keine Events - du könntest dich aber an dem refreshStatistics-Call hängen, der wird als Ajax-Requesta bei jedem Seitenaufruf abgesetzt, auch bei gecachten Seiten. Damit würde es auch gehen.

Daniel

 

Hallo,

ich habe ebenfalls eine CountDown-Funktion auf der Artikel-Detailseite, bin allerdings noch nicht so tief in der Shopware-Entwicklung drin. Könnt ihr etwas genauer erläutern, was man hier tun muss? Wie funktioniert das mit „an den refreshStatistics-Call hängen“?

LG