2016-06-14 10 views
6

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.

Antwort

1

Um dem Block des Arrays machen Sie die Cache-Einstellungen hinzufügen:

'#cache' => [ 
    'max-age' => 60 * 60 * 24, 
], 

hier Zeit in Sekunden gemessen wird. Siehe auch: https://www.drupal.org/developing/api/8/cache/max-age

Wenn Sie Hinweise über Dinge haben, die einen Reset auslösen müssten, können Sie einige der anderen caching controls verwenden. Es klingt so, als hätten Sie eine klare Vorstellung davon, was Sie wo und wann zwischenspeichern möchten. Die Erforschung der Materialien auf der Cache-API ist also wahrscheinlich Ihre Zeit wert.

Vorausgesetzt, dass Sie aus einer zweiten Datenbank ziehen, möchten Sie vielleicht auch BigPipe erkunden, was nicht das ist, was Sie gefragt haben, aber für Anwendungsfälle gedacht ist, in denen es eine Weile dauert, alle Informationen zu sammeln gegebene Seite.Wahrscheinlich würde die Verwendung von Blöcken, die über BigPipe erstellt wurden, eine bessere Benutzererfahrung bieten als Daten, die in Drupal für eine bestimmte Zeit zwischengespeichert wurden (die gesamte Cache-Engine wurde neu aufgebaut, um uns von diesem Muster wegzukommen).

+1

Ich habe diese Lösung versucht, es scheint nicht zu funktionieren. – Anders8

+0

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

+0

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

0

stellte sich heraus, das ist eine „große“ Fehler in D8, die auf gearbeitet hat wird: https://www.drupal.org/node/2352009

Kurz gesagt, zur Zeit der Interne Seite Cache-Modul die „max-age“ Eigenschaft sprudelte zwischenspeicherbar Metadaten ignoriert Arrays von Render .

Auch wenn Sie nicht mit dem internen Seite Cache-Modul und stattdessen einige externen Cache wie Varnish waren, wird die max-age-HTTP-Header immer nur auf, was Sie in „Seite Cache Höchstalter“ konfiguriert haben, in der Leistung die Einstellungen. Siehe https://www.drupal.org/node/2732129, das bei Bedarf eine Problemumgehung aufweist.

Verwandte Themen