Drupal 8:Wie programmiere ich Cache-Alter für ein Modul in Drupal 8 programmgesteuert?
Ich habe den Code für einen Block erfolgreich seine Arbeit und die Rückgabe. Der Block heißt "RacerProfile" und speichert seinen gesamten Inhalt in der Variablen "$ pageContent". Am Ende gibt es die #markup zurück. OK. Wie kann ich das jetzt alle sechs Stunden für ungültig erklären?
/**
* Provides a 'Racer Profile' Block
*
* @Block(
* id = "racer_profile",
* admin_label = @Translation("Slider v1 block")
*)
*/
class RacerProfile extends BlockBase {
/**
* {@inheritdoc}
*/
public function build()
{
// does all the work to make $pageContent via non-drupal
// database queries. However, for this example, let's just
// just imagine it gets the time of day. Then, let's set
// let's set the cache age to 5 seconds so F5-F5-F5-F5... should
// show 12 changes per minute on a repeatable schedule
$pageContent.= "<p> Date and Time: " . date("F jS Y h:i:s A");
return array(
'#markup' => $pageContent,
'#cache' => ['max-age' => 5 ,],
);
}
}
In anderen Drupal Antworten habe ich „D8 hat Cache-Tags und Kontexte, die automatisch den Block, wenn sich etwas ändert wird ungültig.“ Gesehen Gut, aber mein Code überprüft eine zweite Datenbank. Es gibt keine Möglichkeit für Drupal zu wissen, was sich dort drüben ändert. (Ohne zu überprüfen, offensichtlich.) Also, wie füge ich Cache-Tags mit bestimmten Timeouts hinzu? (Oder machen Cache-Tags das auch?) Ich kann keine Beispiele finden.
Anmerkungen:
-Die obige Code erzeugt nicht das gewünschte Ergebnis. Die Seite ist für anonyme Benutzer statisch. Es ändert sich nur, wenn ein Benutzer/Admin den Cache über den Web-Admin löscht.
- Offensichtlich hängt dies nicht mit dem maximalen Cache-Alter im Adminbereich von Konfiguration> Leistung> Caching> Alter des Seitencaches zusammen. Ich möchte nicht, dass dies für die gesamte Website gilt, nur für diesen Block. Darüber hinaus kontrolliert diese Einstellung diesen Caching-Aspekt anscheinend nicht, sondern stattdessen die Cache-Informationen, die in den Header der gerenderten Seiten eingefügt wurden.
- Das hängt natürlich auch nicht mit settings.php zusammen, da ich nicht möchte, dass dies für die gesamte Site gilt und die verschiedenen Module unterschiedliche Timeout-Anforderungen haben.
-Der Verkehr für die Website ist relativ geringes Volumen, wenn also eine Sache vier Mal am Tag auch nur einmal täglich gemacht werden muss, ist kein Problem. Alle sechs Stunden bedeutet, dass es sich geändert hat, bevor die Leute in vier Zeitzonen aufwachen. Meist. ;) Ich sage hier ausdrücklich, dass ich daran interessiert bin, diese Arbeit überhaupt zu haben, bevor ich mir Sorgen um die Optimierung der Auslastung oder Nutzung mache.
-Ich habe mehrere benutzerdefinierte Blöcke mit unterschiedlichen Ablaufzeiträumen.
-Ich habe sicherlich viel gegoogelt, und habe noch Beispiele zu finden, die eine bestimmte (in einer Zeiteinheit) Timeout für einen Modulblock angegeben. Sogar innerhalb des D8-Moduls Beispiele auf drupal.org
-Importantly muss der Block seinen Cache für anonyme Benutzer gesteuert haben. Leute ohne Konten, "die Öffentlichkeit", die die Website durchsuchen.
Ich habe diese Lösung versucht, es scheint nicht zu funktionieren. – Anders8
Haben Sie das Debugging im Cache aktiviert, um zu sehen, was zwischengespeichert wird (https://www.drupal.org/developing/api/8/response/cacheable-response-interface#debugging)? Verwenden Sie diesen Block, was verhindert Caching? – acrosman
Ich habe auch dieses genaue Problem (meine Cache-Tags sind "external", so dass ich stattdessen ein bestimmtes maximales Alter für diese Seitenantwort festlegen möchte). Das Festlegen der Max-Age-Cache-Daten funktioniert nicht, da die 'PageCache.php'-Datei dies ignoriert, wenn der Expir-Header für die Seite berechnet wird. Siehe Funktion 'fetch' dieser Klasse. – Brian