Introduzione
Il caching è una funzione molto utile che permette di generare dei file HTML contenenti le pagine complete in modo da evitare di generarle nuovamente alle successive richieste. Questo riduce drasticamente il numero di query al database e il tempo necessario a caricare la pagina.
Normalmente si consiglia di lasciarlo disabilitato, salvo sia proprio necessario per alleggerire il server. Ovviamente a tutti piacerebbe usare al meglio il sistema di caching, ma perchè complicarsi la vita quando non strettamente necessario?
In questa pagina analizzeremo il sistema caching di Zikula, ne discuteremo pro e contro e vedremo come configurarlo.
Due livelli di caching: pnRender e Xanthia
In Zikula il caching è implementato su due livelli: pnRender e Xanthia.
Il caching a livello di pnRender è un caching parziale, viene infatti memorizzata solo una parte della pagina, quella gestita dal modulo e dai blocchi. Questo è il livello di caching principale di Zikula e normalmente presenta solo leggeri effetti collaterali, dipendenti dai moduli che si stanno utilizzando.
Il caching a livello di Xanthia è invece detto full page caching, in quanto tutta la pagina viene memorizzata in cache. Salvo non siate veramente disperati per il carico sul vostro server, si sconsiglia di abilitare questa opzione in quanto vi sono degli effetti collaterali importanti. In questo caso il codice del modulo non viene mai eseguito (tranne quando si rigenera la pagina) e vi possono essere delle conseguenze più o meno gravi (pensate ad esempio al conteggio delle letture di una pagina, sarebbe completamente falsata).
Ovviamente il secondo livello di Xanthia è disponibile solamente se state utilizzando un tema Xanthia.
Perchè è disabilitato di default?
Di default il caching delle pagine è disabilitato in quanto, sebbene il sistema di caching sia alla base del framework, perchè funzioni correttamente è necessario che sia utilizzato correttamente dagli autori dei moduli. In caso contrario possono verificarsi degli effetti collaterali di vario tipo.
Dato che, durante il processo di personalizzazione, vengono mediamente installati molti moduli di terza parte per cui il team di Zikula non può garantire il corretto funzionamento del caching, di default è disabilitato. Si lascia quindi all'amministratore l'analisi e il testing del caching con quella particolare configurazione di moduli.
Inoltre il sistema di caching ha anche dei contro. Permette infatti di salvare tempo e calcoli a discapito della memoria su disco. Infatti i file di cache devono essere salvati sul disco e, per siti molto grandi, possono essere davvero tanti.
Quali sono i rischi effettuando caching
Se l'autore del modulo non ha fatto nulla affinchè il caching funzioni è probabile che quel modulo presenti dei problemi abilitandolo. E' infatti importante assicurarsi che tutti i controlli (es. permessi, errori ecc.) vengano effettuati prima che intervenga il sistema di caching. In caso contrario si rischia di:
- limitare l'accesso ad una pagina: se la pagina viene generata quando fa la richiesta un utente che non vi ha accesso, tutti gli utenti successivi non la vedranno, anche se loro dovessero essere abilitati;
- dare accesso ad una pagina: può accadere anche il contrario, cioè che la pagina venga generata da un utente che ha i permessi e rimanga visibile a tutti gli utenti;
- esporre dati personali: pensate ad esempio ad una pagina con un form che viene auto compilato con i dati dell'utente registrato, tutti gli utenti successivi potrebbero vedere i suoi dati;
- non considerare gli errori: se non si controlla che i dati siano correttamente generati, si rischia che un errore singolo (es. timeout del database) venga visualizzato per tutta la durata del file di cache;
Ribadisco che questi sono i rischi di un modulo mal progettato, non i rischi di tutti i moduli. Sono cose da tenere in considerazione, e possibilmente testare, soprattutto quando si abilita il caching con tanti moduli di terze parti installati.
Qual è una buona configurazione di caching
Non esiste una configurazione perfetta, anche perchè se esistesse il caching non sarebbe ne disabilitabile ne configurabile (che bisogno ci sarebbe di configurare o disabilitare un sistema perfetto?). Si può invece parlare di una buona configurazione, che si adatti alla vostra situazione.
Come abbiamo già detto, salvo abbiate grossi problemi di risorse, lasciare il caching di Xanthia (è quello che si può abilitare nella sezione Temi) disabilitato.
Per quanto riguarda pnRender invece potete abilitarlo dalla sezione pnRender, nel pannello di amministrazione. La durata della cache dovete deciderla voi in base al sito che state gestendo. In teoria, se ogni modulo gestisse la cache in modo perfetto, si potrebbe utilizzare 3600 secondi per tutti i siti. Sarebbe infatti sufficiente che il modulo eliminasse il file di cache ogni volta che il contenuto di quella pagina viene modificato. Dato però che non tutti gli autori sono così scrupolosi nello scrivere i moduli, è necessario trovare un buon compromesso tra prestazioni e funzionalità.
I valori che mediamente si consiglia (non sono valori rilasciati ufficialmente, sono l'insieme dei feedback della comunità internazionale n.d.a.) sono i seguenti:
- 10 secondi, se è un sito che viene aggiornato continuamente, come un forum;
- 3600 secondi, se invece è un sito che contiene prevalentemente pagine statiche che vengono aggiornate raramente;
Vi sembra poco?
Considerate che se ogni pagina viene richiesta 1 volta al minuto, del caching non ve ne fate nulla. Il caching è utile quando le stesse pagine vengono richieste più e più volte al minuto.
Prendiamo come esempio un forum. Mettendo 10 secondi l'utente vede i post praticamente in tempo reale, tuttavia se una pagina viene richiesta 2 volte al secondo, impostando il caching a 10 secondi per 19 volte risparmiate al vostro server molti calcoli e query. Nota: quello del forum è solo un esempio, in realtà il caching non può essere abilitato per pnForum.
Considerate che mettere valori di caching troppo alti è inutile. Ipotizzando di ricevere 2 richieste della stessa pagina al secondo, abbiamo che:
- senza caching generemmo la pagina 7200 volte all'ora
- con il caching di 10 secondi, genereremmo la pagina 360 volte all'ora
- con il caching di 60 secondi, genereremmo la pagina 60 volte all'ora
- con il caching di 60 minuti, genereremmo la pagina una volta all'ora
Vedete quindi come con un caching di 10 secondi ci risparmieremmo 6840 pagine generate, mentre con il caching di 3600 secondi ci risparmieremmo solamente 359 pagine generate in meno.
Vi sembra tanto?
Il precedente calcolo potrebbe portarvi a pensare che allora è inutile mettere 3600 come durata della cache. Considerate però che se le pagine in questione sono tante (es. 100) ed ognuna viene richiesta 2 volte al secondo... allora il risparmio diventa di 35900 pagine in meno all'ora. Non male no?
Infine vi è anche da considerare che rigenerare continuamente i file di cache significa continuare a cancellare e ricreare dei file. Talvolta questo comportamento è malvisto dai servizi di hosting, impostare un valore di caching medio/alto serve anche a diminuire l'utilizzo dell'hard disk in scrittura.