Wir haben einige benutzerdefinierte Blöcke geschrieben, die dynamischen Inhalt rendern. Leider wird beim Caching standardmäßig das erste Rendering dieses Blocks zwischengespeichert (und für anonyme Benutzer nicht aktualisiert). Die Cache-Steuerung scheint nur für authentifizierte Benutzer zu funktionieren. Vermissen wir etwas Offensichtliches? Ist es möglich, anonymes Caching auf Block- (oder Seiten-) Basis zu steuern?
7
Antworten:
Es gibt zwei verschiedene Seiten-Caches.
Der interne dynamische Seiten-Cache funktioniert mit allen Arten von Elementen wie Blöcken und Knoten und verwendet die von diesen Elementen bereitgestellten Cache-Tags, Cache-Kontexte und das maximale Cache-Alter.
Der interne Seiten- Cache ist für vollständige Seiten für anonyme Benutzer vorgesehen und verwendet nur Cache-Tags.
Sie können den Seitencache für anonyme Benutzer mit einem Parameter steuern.
Gehen Sie zur Leistungskonfiguration:
Konfigurieren Sie das maximale Alter des Seitencaches mit der Zeit, wie lange Ihre Informationen gültig sind. Dies ist auch für Proxys und den Browser-Cache wichtig, da es nicht hilfreich wäre, den Drupal-Cache ungültig zu machen, wenn die Seite an anderen Stellen zwischengespeichert wird. Nach dieser Zeit läuft die Seite ab und sollte erneut erstellt werden. Laut Dokumentation:
Aber das ist nicht wahr. Sie sollten diese Zeit für Proxys und den Browser-Cache konfigurieren, aber der interne Seiten-Cache berücksichtigt nicht die Zeit, die Sie dort festgelegt haben. Die einzige zuverlässige Lösung, die ich gefunden habe, besteht darin, den internen Seiten- Cache des Moduls zu deinstallieren oder eine Ablaufzeit in einem EventSubscriber festzulegen (z. B. 3600 Sekunden in der Zukunft):
/src/EventSubscriber/SetExpiresSubscriber.php
mymodule.services.yml
quelle
curl --head
, dasmax-age
ist inCache-Control:
onResponse()
Methode des Dienstes in diesem Beispiel aktualisiert werden, um$page_max_age = \Drupal::config('system.performance')->get('cache.page.max_age');
den Ablauf auf eine feste Anzahl von Sekunden in der Zukunft fest zu codieren, z. B. 3600.Überprüfen Sie die hinzugefügte Routenoption 'no_cache', um die Antworten einer Route als nicht zwischenspeicherbar zu markieren
In Ihrer routing.yml-Datei:
quelle
Wenn der interne Seiten-Cache aktiviert sein muss (dh Sie können Varnish oder eine andere speicherbasierte Lösung nicht verwenden) und der interne Seiten-Cache lediglich die festgelegte Zeit einhalten soll
admin/config/development/performance
, können Sie Ihren eigenen Ereignis-Abonnenten hinzufügen, der den ändert FinishResponseSubscriber, den Drupal bereitstellt. Sie können sogar die Drupal-Konsole verwenden, um den größten Teil des Ereignisabonnenten für Sie zu generieren und dann die anderen Bits von FinishResponseSubscriber zu übernehmen. Ihr Ergebnis würde ungefähr so aussehen:Mit dem obigen Code wird die Cache-Lebensdauer auf 300 Sekunden fest codiert. Sie können jedoch stattdessen problemlos die Benutzereinstellung abrufen.
quelle
Ich denke, Sie müssen das Modul 'Interner Seiten-Cache' deaktivieren, damit die Cache-Kontexte funktionieren.
Wenn "Interner Seiten-Cache" aktiviert ist, werden Inhalte für anonyme Benutzer standardmäßig zwischengespeichert.
Wenn Sie "Interner Seiten-Cache" deaktivieren, müssen Sie Drupal weiterhin anweisen, keinen Cache für anonyme Benutzer zu erstellen
tut es für mich - ist aber wahrscheinlich nicht ganz richtig.
quelle