Per gli amministratori

Come amministratore, Joomla ti offre la possibilità di memorizzare nella cache alcune parti del tuo sito. Puoi scegliere di memorizzare nella cache intere pagine web oppure solo alcune parti di esse. Questa guida spiega come fare.

In una pagina web di un sito Joomla ci sono 3 elementi che possono essere memorizzati nella cache:

  1. L'intera pagina stessa – la cache della pagina
  2. L'output del componente Joomla per quella pagina web – nota come cache della vista
  3. L'output dei moduli mostrati in quella pagina – nota come cache del modulo

Hai a disposizione una serie di impostazioni della cache che ti permettono di controllare cosa viene memorizzato nella cache:

  1. Il plugin di sistema "Sistema – Cache pagina"
  2. La Configurazione globale, scheda Sistema, Impostazioni cache. Qui l'opzione Cache di sistema può essere impostata su
    • SPENTO – Cache disabilitata
    • ACCESO – Cache conservativa
    • ACCESO – Cache progressiva
  3. Molti moduli, nelle loro opzioni, hanno una scheda Avanzate in cui la Cache può essere impostata su Usa globali o Nessuna cache

Come descritto di seguito, esistono anche delle regole per la cache implementate all'interno del codice di Joomla, sulle quali non hai alcun controllo.

Puoi pulire la cache tramite il menu Amministrazione → Sistema → Pulisci cache. In generale, puoi pensare a Joomla come dotato di 3 livelli di cache, con aggressività crescente

  1. Cache conservativa
  2. Cache progressiva
  3. Cache della pagina

Inoltre, gli sviluppatori Joomla possono utilizzare le funzionalità di cache per memorizzare il risultato di query al database, ad esempio per aumentare la reattività del sito, ma questo esula dalle capacità di un amministratore.

Cache della pagina

Per attivarla, vai su Amministrazione → Estensioni → Plugin. Trova quindi il plugin Sistema – Cache pagina, e abilitalo. Questo significa che le pagine del sito verranno ora memorizzate nella cache e ogni volta che vengono richieste nuovamente, verrà servita la pagina memorizzata nella cache, invece di essere generata da Joomla a partire dalle informazioni nel database. La pagina memorizzata nella cache continuerà a essere servita fino alla sua scadenza – come definito dal parametro Durata cache nella scheda Amministrazione → Configurazione globale → Sistema → Impostazioni cache.

Se stai leggendo questa pagina come tutorial e vuoi testare la cache della pagina, è meglio impostare le impostazioni della cache nella Configurazione globale come segue:

  • Gestore cache – File
  • Percorso alla cartella cache – lascia vuoto
  • Durata cache – 15 (il valore predefinito di 15 minuti)
  • Cache specifica per piattaforma - No
  • Cache di sistema – SPENTO – Cache disabilitata

Per verificare che la cache della pagina funzioni, vai su una pagina del sito web che mostra un articolo. Dopo aver visualizzato quella pagina dovresti trovare nel file system una directory cache/page con all'interno un file con un nome simile a xxx-cache-page-yyy.php dove xxx e yyy sono lunghe stringhe hash. Joomla deve memorizzare pagine di cache separate per URL diversi, quindi la seconda stringa di cifre esadecimali è un hash dell'URL della pagina web del sito, per rendere il nome del file univoco per quella pagina.

Quindi utilizza le funzionalità dell'Amministrazione per modificare il testo di quell'articolo, e visualizza nuovamente la pagina web del sito. Dovresti trovare la versione memorizzata nella cache, non il tuo testo modificato.

Modificare un articolo (o un altro elemento di Joomla) non pulisce la cache della pagina per la pagina/e web in cui quell'articolo è mostrato. Per pulire la cache della pagina vai su Amministrazione → Sistema → Pulisci cache. Fai clic sulla casella di spunta accanto al Gruppo cache chiamato "page", e premi il pulsante Elimina. Quando visualizzerai di nuovo la tua pagina web, dovrebbe ora mostrare il tuo testo modificato.

Se il tuo sito ha una funzione come un carrello della spesa, applicare la cache della pagina causerà dei problemi, poiché le pagine devono mostrare ciò che il cliente ha già selezionato, invece di mostrare una pagina memorizzata nella cache che è comune a tutti. Tuttavia, puoi configurare il plugin Sistema - Cache della pagina per escludere dalla cache specifiche voci di menu o specifici URL e intervalli di URL (nella scheda Avanzate), in modo che vengano messe in cache solo le pagine realmente statiche.

Cache conservativa

Con la Cache conservativa puoi mettere in cache l'output della vista dei componenti e l'output di quei moduli che consentono la cache. Nota però che questo funzionerà solo sulle pagine che non sono già messe in cache tramite la Cache della pagina. Per quelle pagine l'intera pagina web viene messa in cache, e la Cache conservativa non viene nemmeno considerata.

Per attivare la Cache conservativa:

  1. Vai su Amministratore → Sistema → Configurazione globale → scheda Sistema e, all'interno di Impostazioni cache, imposta Cache di sistema su ON – Cache conservativa
  2. Vai su Amministratore → Estensioni → Moduli e seleziona i moduli che desideri mettere in cache. Se quel modulo consente la cache, allora nella scheda Avanzate dovresti poter impostare Cache su
  • Usa globale – questo modulo verrà messo in cache (con l'opzione globale ora impostata su Cache conservativa)
  • Nessuna cache – questo modulo non verrà messo in cache.

(Nota che la Durata cache nella Configurazione globale è in minuti, ma la Durata cache nelle impostazioni del modulo è in secondi.)

Per verificare che funzioni, vai sul tuo sito, assicurati di essere disconnesso, e naviga verso una pagina web che mostra un articolo. Controlla il tuo file system e dovresti trovare una cartella cache/com_content contenente un file di cache.

Troverai anche altre directory come cache/com_languages (poiché la visualizzazione della pagina comporta il caricamento della lingua corrente, che verrà anch'essa messa in cache) e anche directory relative alla cache dei moduli, ad es. cache/com_modules. Questi derivano dall'uso della cache che gli sviluppatori hanno codificato all'interno dell'applicazione Joomla.

Se modifichi e salvi quell'articolo e poi aggiorni la pagina del sito, scoprirai che il sito mostra il testo aggiornato questa volta. Questo perché ogni volta che la modifica viene salvata, Joomla pulisce la cache per quell'articolo.

Tuttavia, puoi dimostrare che la cache sta funzionando se modifichi il file di cache nella directory cache/com_content usando un semplice editor di testo. Usando l'editor, cambia una lettera all'interno del testo dell'articolo nel file di cache e salva il file. Poi, quando aggiorni la pagina web, dovresti vedere la modifica che hai apportato al file di cache.

Come puoi selezionare quali viste dei componenti vengono messe in cache, e in quali circostanze? Purtroppo, non puoi farlo. Questo è determinato dagli sviluppatori dei componenti core di Joomla ed è codificato nel codice PHP del componente. I criteri sono diversi per ciascun componente. Tuttavia, puoi facilmente scoprire quali criteri vengono utilizzati perché per ciascuno dei componenti del sito sono codificati nel file DisplayController.php del sito. Ad esempio, al momento di questa revisione (Joomla versione 5) per il componente Contatti troviamo in components/com_contact/src/Controller/DisplayController.php

    public function display($cachable = false, $urlparams = [])
    {
        if ($this->app->getUserState('com_contact.contact.data') === null) {
            $cachable = true;
        }

Questo significa che le viste associate ai contatti saranno memorizzabili in cache a meno che non vi siano dati di sessione con chiave com_contact.contact.data – il che sarà il caso se nella sessione utente l'utente ha visualizzato un modulo di contatto (ad es. su una pagina indicata da una voce di menu di tipo Contatti → Contatto singolo).

Il file equivalente per gli articoli components/com_content/src/Controller/DisplayController.php contiene:

    public function display($cachable = false, $urlparams = false)
    {
        $cachable = true;

        /**
         * Set the default view name and format from the Request.
         * Note we are using a_id to avoid collisions with the router and the return page.
         * Frontend is a bit messier than the backend.
         */
        $id    = $this->input->getInt('a_id');
        $vName = $this->input->getCmd('view', 'categories');
        $this->input->set('view', $vName);

        $user = $this->app->getIdentity();

        if (
            $user->get('id')
            || ($this->input->getMethod() === 'POST'
            && (($vName === 'category' && $this->input->get('layout') !== 'blog') || $vName === 'archive'))
        ) {
            $cachable = false;
        }

L'espressione $user->get('id') è vera se si tratta di un utente connesso. Questo significa che gli articoli non vengono mai memorizzati in cache per gli utenti connessi. Le espressioni successive riguardano altre condizioni in cui la cache non viene eseguita, anche se l'utente non è connesso.

In questo modo puoi quindi scoprire le circostanze in cui viene eseguita la memorizzazione in cache, ma modificarle non è consigliabile. Puoi anche dimostrare che i moduli vengono memorizzati in cache utilizzando il modulo Percorso di Joomla, assicurandoti che sia mostrato in qualche posizione modulo della pagina web, impostando la sua opzione di memorizzazione in cache e modificando manualmente il file memorizzato in cache/mod_breadcrumbs.

Cache progressiva

Come la Cache conservativa, anche la Cache progressiva memorizza in cache l'output delle viste dei componenti e dei moduli. La differenza funzionale tra le due è che con la Cache progressiva per gli utenti disconnessi tutti i moduli vengono sempre memorizzati in cache. In questo caso, impostare l'opzione Nessuna cache per un modulo non ha alcun effetto. Se l'opzione di archiviazione della cache è impostata su File, puoi trovare il file di cache dei moduli (l'output di tutti i moduli viene archiviato nello stesso file) all'interno della directory cache/com_modules.

Per attivare la Cache progressiva, vai su Amministratore → Sistema → Configurazione globale → scheda Sistema e all'interno di Impostazioni cache imposta Cache di sistema su ON – Cache progressiva.

Per quanto riguarda le condizioni per la memorizzazione in cache delle viste dei componenti principali di Joomla, non c'è alcuna differenza tra cache conservativa e progressiva. Nonostante quanto si possa leggere su alcuni siti web e nelle risposte alle domande su Stack Overflow, non è vero che la Cache conservativa si riferisce al caso in cui l'utente non è connesso e la Cache progressiva al caso in cui l'utente è connesso.

Riepilogo

Di seguito un riepilogo dei tipi di cache.

Cache dell'intera pagina

  • Configurazione: Plugin integrato (Amministratore → Estensioni → Gestione plugin → System - Page Cache)
  • Memorizza in cache: ogni pagina intera del tuo sito
  • Basato su: URL
  • Ulteriori informazioni:
    • Memorizzazione in cache del browser facoltativa: memorizza in cache anche sul browser/computer dei tuoi visitatori
    • Memorizza in cache solo le pagine per i visitatori ospiti (non per i visitatori connessi). Fai attenzione a utilizzare questo plugin se hai un sito interattivo in cui vuoi servire contenuti basati sulle informazioni di sessione/cookie piuttosto che sul solo URL semplice. Funzionalità come un carrello della spesa non funzioneranno.

Cache della vista

  • Configurazione: Configurazione globale -> Cache
  • Memorizza in cache: ogni vista di un componente
  • Basato su: URL, vista, parametri, ...
  • Ulteriori informazioni: gli sviluppatori di componenti devono includerlo nel loro codice affinché funzioni. Questo generalmente non viene fatto. Il componente principale dei contenuti di Joomla lo utilizza, ma solo per i visitatori ospiti del sito, anche se questo non è obbligatorio per ogni componente.

Cache del modulo

  • Configurazione: Configurazione globale -> Cache
  • Memorizza in cache: ogni modulo (personalizzato singolarmente tramite i parametri avanzati di ciascun modulo)
  • Basato su: l'id del modulo, i livelli di visualizzazione dell'utente e il parametro Itemid nella richiesta HTTP
  • Ulteriori informazioni: è necessario disabilitarlo su alcuni moduli per evitare problemi

Ulteriore cache

Se desideri scoprire altri sistemi e possibilità di cache, potresti voler controllare le estensioni di terze parti dedicate alla cache.

Motori o archivi di cache

  • Configurazione: Configurazione globale -> Cache

Qui puoi scegliere quale sistema vuoi che il tuo sito utilizzi per tutta la cache. Alcune opzioni sono: APC, Eaccelorator, File, Memcache, Redis, XCache.

APC, ad esempio, memorizza in cache anche il tuo opcode PHP.

Per sviluppatori

Questa sezione necessita di revisione per Joomla! 4/5.

La classe JCache consente molti tipi e livelli diversi di cache. Le seguenti sottoclassi sono create appositamente, ma puoi aggiungerne di tue, oppure usare la classe principale in molti modi diversi.

Non dimenticare che il primo livello di cache incontrato sostituirà qualsiasi cache più profonda. Suppongo che anche troppi livelli siano controproducenti (da verificare comunque).

  • JCacheView memorizza in cache e restituisce l'output di una data vista (in MVC). Un id di cache viene generato automaticamente dall'URI, dalla vista specifica e dal suo metodo specifico, oppure puoi fornirne uno tuo.

Questo può essere fatto automaticamente tramite la funzione display del controller di base. Ad esempio nel controller del tuo componente:

class DeliciousController extends JController {
    function display() {
        parent::display(true); //true asks for caching.
    }
}

Ci sono anche alcuni urlparams da considerare. Controlla questo Joomla StackExchange

Inoltre, tieni presente che eventuali aggiornamenti (come conteggi di visite o visualizzazioni) NON verranno aggiornati (a meno che tu non li aggiunga al di fuori di questo metodo e quindi al di fuori di qualsiasi parte MVC più profonda).

  • JCachePage memorizza in cache e restituisce il corpo della pagina.
  • JCacheCallback memorizza in cache e restituisce l'output e i risultati di funzioni o metodi.

Se vuoi memorizzare in cache le query, questa è una buona classe per farlo, come illustrato qui: Using caching to speed up your code

  • JCacheOutput memorizza in cache e restituisce l'output.

Questo è pensato piuttosto per memorizzare in cache una parte specifica di codice PHP. Agisce come un buffer di output, ma in cache.