2016-06-14 9 views
6

Drupal 8:Come faccio a impostare in modo programmato l'età della cache per un modulo in Drupal 8?

Ho il codice per un blocco che sta facendo il suo lavoro e lo restituisce. Il blocco si chiama "RacerProfile" e scarica tutto il suo contenuto nella variabile "$ pageContent". Alla fine restituisce il #markup. Ok. Ora, come posso dire di invalidare ogni sei ore?

/** 
* 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 altre risposte Drupal, ho visto "D8 ha tag di cache e contesti che invaliderà automaticamente il blocco, se qualcosa cambia." Bene, ma il mio codice sta controllando un secondo database. Drupal non ha modo di sapere cosa sta cambiando laggiù. (Senza verificare, ovviamente.) Quindi, come faccio ad aggiungere i tag della cache con timeout specificati? (Oppure i tag della cache lo fanno anche?) Non riesco a trovare esempi.

Note:

-Il codice di cui sopra non produce il risultato desiderato. La pagina è statica per gli utenti anonimi. Cambia solo quando un utente/amministratore cancella la cache tramite l'amministratore web.

-Ovviamente, questo non è correlato all'età massima della cache nell'area di amministrazione di Configurazione> Prestazioni> Memorizzazione nella cache> Durata massima della cache della pagina. Non voglio che questo si applichi all'intero sito, solo questo blocco. Inoltre, apparentemente questa impostazione non controlla questo aspetto del caching, ma invece le informazioni sulla cache che sono state inserite nell'intestazione delle pagine renderizzate.

-Ovviamente, questo non è correlato a settings.php in alcun modo, poiché ancora una volta non voglio che questo si applichi all'intero sito, e i vari moduli avranno requisiti di timeout differenti.

-Il traffico per il sito è un volume relativamente basso, quindi se il rendering di una cosa quattro volte al giorno, anche solo una volta al giorno non è un problema. Ogni sei ore significa che è cambiato prima che le persone si svegliano in quattro fusi orari. Soprattutto. ;) Sto affermando esplicitamente qui che sono interessato ad avere questo lavoro a tutti prima che mi preoccupi di ottimizzare il carico o l'utilizzo.

-Ho più blocchi personalizzati con diversi periodi di scadenza.

-Ho sicuramente cercato su Google e non ho ancora trovato esempi che specificano un timeout specifico (misurato in un'unità di tempo) per un blocco di moduli. Anche all'interno degli esempi del modulo D8 su drupal.org

-Importantemente, il blocco deve avere la sua cache controllata per gli utenti anonimi. Persone senza account, "il pubblico" che naviga nel sito.

risposta

1

a rendere matrice è possibile aggiungere le impostazioni della cache del blocco:

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

Qui il tempo è misurato in secondi. Vedere anche: https://www.drupal.org/developing/api/8/cache/max-age

Se si dispone di suggerimenti sulle cose che dovrebbero attivare un ripristino è possibile utilizzare alcune delle altre caching controls. Sembra che tu abbia una chiara idea di cosa vuoi mettere nella cache dove e quando, quindi esplorare i materiali sull'API della cache vale probabilmente il tuo tempo.

Dato che stai prelevando da un secondo database, potresti anche voler esplorare BigPipe, che non è quello che hai chiesto, ma è pensato per casi d'uso in cui ci vorrà un po 'per raccogliere tutte le informazioni per un pagina data.Probabilmente l'uso di blocchi creati tramite BigPipe fornirebbe un'esperienza utente migliore rispetto ai dati memorizzati nella cache in Drupal per un periodo di tempo prestabilito (l'intero motore della cache è stato ricostruito per consentirci di allontanarci da tale schema).

+1

Ho provato questa soluzione, non sembra funzionare. – Anders8

+0

Hai attivato il debug della cache per vedere cosa viene memorizzato nella cache (https://www.drupal.org/developing/api/8/response/cacheable-response-interface#debugging)? Stai usando questo blocco è cosa impedisce il caching? – acrosman

+0

Ho anche questo problema esatto (i miei tag di cache sono "esterni" quindi voglio impostare una specifica età massima per questa risposta di pagina). L'impostazione dei dati della cache massima non funziona perché il file 'PageCache.php' lo ignora quando calcola l'intestazione di scadenza per la pagina. Vedi la funzione 'fetch' di quella classe. – Brian

0

Risulta questo è un "importante" bug in D8 che è in lavorazione: https://www.drupal.org/node/2352009

In breve, il modulo pagina interna Cache attualmente ignora la proprietà "max-age" del bollito fino metadati cacheable da rendere gli array .

Anche se si dovesse non utilizzando il modulo pagina interna Cache e invece qualche cache esterna come Varnish, l'intestazione HTTP max-age è sempre solo impostato su ciò che avete configurato nella "Pagina di cache massima età" nelle prestazioni impostazioni. Vedere https://www.drupal.org/node/2732129 che ha una soluzione alternativa se necessario.

Problemi correlati