Für eine große Institutionswebsite mit umfangreichen Caches möchte ich so schnell wie möglich Caches generieren, damit kein Benutzer bei der Cache-Generierung ankommt.
Ich habe alle Minuten einen Cron eingerichtet, der dies erledigt, indem er einige Funktionen ausführt und kritische Seiten anfordert. Ich suche jedoch nach einer Möglichkeit, um zu wissen, wann der Cache geleert wurde , vorzugsweise nach einem Hook, damit ich diesen starten kann Erzeugungsfunktionen.
Irgendeine Idee ?
Antworten:
Es gibt kein Drupal 7.x, aber dieses wurde als Core-Hook hinzugefügt, hook_rebuild in Drupal 8.x, nachdem genügend Leute es angefordert hatten. Es kann jedoch eine bessere Möglichkeit geben, Ihr Problem in 7.x zu lösen - Sie versuchen, eine Art Cache-Aufwärmfunktion zu initiieren, nachdem cron den Cache geleert hat, richtig? Eine andere Möglichkeit, dies zu erreichen, besteht in der Verwendung von Elysia cron, das eine Reihe von signifikanten Verbesserungen der Funktionsweise von cron aufweist, von denen jedoch zwei für Ihren Anwendungsfall relevant sein könnten:
Mit diesem Modul können Sie die Ausführung Ihres Cron genauer steuern, um das veraltete Cache-Problem zu beheben. Insbesondere können Sie Ihren Neuerstellungsfunktionen einen Hook hinzufügen, um cron zu verwenden, und diese Vorgänge dann mit Elysia cron so einstellen, dass sie unmittelbar nach dem Cache-Löschvorgang ausgeführt werden.
Es hört sich auch so an, als hätten Sie Probleme mit Cron, was dazu führt, dass der Cache zu oft neu erstellt wird. In diesem Fall können Sie festlegen, dass der bestimmte Cache-Löschvorgang in Elysia cron mit einer anderen Geschwindigkeit ausgeführt wird als die übrigen Cron-Vorgänge. So wird beispielsweise die Suchindizierung alle 5 Minuten aktualisiert, der vollständige Cache-Löschvorgang wird jedoch nur alle 5 Minuten ausgeführt 6 Stunden usw.
quelle
Nein, das gibt es nicht. Nicht wirklich. Zumindest nicht in 6 oder 7. Angenommen, 7:
Wenn du siehst,
drupal_flush_all_caches()
wirst du sehen, dass sie aufrufthook_flush_caches()
. Dieser Haken soll:Es wäre verlockend, den Hook Ihres Moduls einfach zum Letzten zu machen und dort Code zu schreiben. Aber schauen wir uns noch einmal an
drupal_flush_all_caches()
. Das Löschen geschieht folgendermaßen:Dies bedeutet, dass alle Haken abgefeuert werden, bevor etwas wirklich gelöscht wird. Es gibt nur eine Funktion nach der eigentlichen Löschung genannt
_system_update_bootstrap_status()
, aber es nur Anrufehook_boot
,hook_exit
,hook_watchdog
undhook_language_init
- Haken Sie wollen nicht nur implementieren , bieten Cache-clear abhängige Funktionalität.quelle
Der Weg, dies zu tun, ist
hook_flush_caches
in Kombination mitregister_shutdown_function
. Beispielcode:Using
register_shutdown_function
bedeutet, dass unsere Cache-Rebuilding-Funktion aufgerufen wird, nachdem die Caches gelöscht wurden. Wir missbrauchenhook_flush_caches
auf eine Weise, die niemals beabsichtigt war, aber dies sollte genau das tun, was Sie brauchen.quelle
Breite Striche hier:
Während es in Pre-D8 keinen Haken gibt, können Sie Ihr eigenes Datenbank-Backend auf Basis des Standard-Backends
DrupalDatabaseCache
schreiben und dann eine oder alle Arten von Logik in Ihreclear()
Funktion schreiben . Ein kurzer Blick würde darauf hindeuten, dass dies in D7 einigermaßen einfach ist (kopieren Sie die Klasse einfach in Ihren benutzerdefinierten Namen und ändern Sie sie usw., indem Sie einmodule_invoke_all()
entsprechendes einfügen ), und mit dem cache_backport-Modul würde es sogar in D6 funktionieren. Zeigen Sie dann auf alle Cachebehälter, auf die Sie Lust haben, und machen Sie sich auf den Weg.quelle
Wenn Sie an der Quelle suchen
drupal_flush_all_caches()
undclear_cache_all()
, sehen Sie , dass keine Haken Post Clearing aufgerufen werden, was ein ziemlich Bug doofer ist.Es ist sehr schwierig zu garantieren, dass ein Benutzer niemals auf die Erstellung einiger Cache-Einträge warten muss, daher versuche ich, vollständige Cache-Löschvorgänge so weit wie möglich zu vermeiden.
Eine wirklich hilfreiche Methode ist das Ändern der Leistungsseite, um einen Submit-Handler einzurichten, der nur die vorwärtsgerichteten Caches löscht und die Menüs, die Registrierung und ähnliche Kerncaches nicht berührt. Ich habe damit gute Ergebnisse erzielt, da die Wiederherstellung des Menüs und der Registrierung etwa die Hälfte der Zeit für eine vollständige Cache-Wiederherstellung in Anspruch nimmt.
Das andere, was ich habe, ist ein Drush-Skript, das
drupal_http_request()
alle meine URLs (nicht nur die wichtigen) überprüft, damit alles zwischengespeichert wird. Wie dies gemacht wird, ist von Standort zu Standort unterschiedlich. Manchmal kann ich nur die veröffentlichten Knoten mit EFQ versehen und auf diese Weise URLs erstellen. In anderen Fällen können Sie die XML-Sitemap-Tabellen abfragen, um Ihre URL abzurufen. Ich rufe dies dann von meinem System-Cron so oft auf, wie ich es brauche.quelle
Einige Optionen:
https://www.drupal.org/project/cache_graceful könnte genau das sein, was Sie wollen.
https://www.drupal.org/project/apdqc verfügt über 2 Hooks, die auf ein Cache-Clear abfeuern, sodass Sie das Clear ändern
drupal_alter('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);
und anschließend auf das Clear reagieren könnenmodule_invoke_all('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);
. Holen Sie sich APDQC richtig funktioniert und setzen Sie$conf['apdqc_call_hook_on_clear'] = TRUE;
in Ihrer settings.php-Datei & dann sollten die Hooks aufgerufen werden, wenn ein Cache-Clear durchgeführt wird.quelle
Dies ist möglicherweise nicht für alle geeignet und für das OP möglicherweise nicht schnell genug, da es erst bei der Initialisierung der nächsten Seite ausgelöst wird. Es hat mir jedoch geholfen, Code auszulösen, kurz nachdem ein "Cache alle leeren", der nicht zeitkritisch war.
Wenn Sie einen bestimmten Behälter als Ziel haben, kann der obige geändert werden, um dies zu unterstützen, solange der gesamte Behälter an der Stelle geleert wird, an der der Cache leer ist.
hook_init
wird nur für nicht zwischengespeicherte Seiten ausgeführt. Obwohl ein vollständiges Löschen des Cache keine zwischengespeicherten Seiten bedeuten sollte, sollte dies kein Problem verursachen. Externe Caching-Systeme wie Varnish werden diese Auslösung jedoch behindern und bedeuten, dass sie nur auftreten, wenn die nächste ordnungsgemäße Anforderung an Drupal zurückgeht.quelle
Ich hatte ein ähnliches Bedürfnis, bei dem ein Kunde sowohl Drupal- als auch Varnish-Caches leeren wollte, als er den Knopf "Alle Caches leeren" drückte. Ich habe diesen Menüpunkt gekapert, um dies zu tun.
Dies wird keine Cache-Löschvorgänge auf cron oder anderswo treffen - nur über den Menü-Link.
quelle
Möglicherweise möchten Sie https://www.drupal.org/project/recacher ausprobieren - es verwendet das Cache Expiration-Modul, um abgelaufene Seiten zu erkennen und dann nur diese Seiten mithilfe der hervorragenden HTTPRL erneut zwischenzuspeichern.
quelle