Caching delle pagine PHP, o di porzioni di esse

Siti dinamici con PHP
Impara a creare siti dinamici professionali con PHP

Scritto da Luca Ruggiero nella sezione Php

La tecnica del caching delle pagine è utile a limitare il carico di lavoro del server e/o del database in presenza di script complessi o pesanti, ma di cui non possiamo fare a meno per conferire le giuste funzionalità alle nostre applicazioni, anche nel caso in cui siano state ottimizzate al massimo.

Si pensi ad una query complessa su quattro tabelle o alla chiamata di API remote (XML, etc...) che rispondono lentamente: la soluzione è dunque quella di mettere in cache le pagine, o le porzioni di esse che elaborano dei script pesanti o molto complessi.

Vediamo come creare un sistema di caching in PHP, attraverso una classe personalizzata. Segue il codice, che salveremo nel file cache.inc, corredato da opportuni commenti:

<?PHP
    // Creo la classe
    class cache
    {
        // Definisco le variabili che mi servono, avendo cura di impostare "memoria"
        // come classe pubblica... dopo vedremo il perchè
        private $nome = "";
        public $memoria = false;
        // Creo la funzione di apertura della cache, passando come parametri
        // il percorso (o nome della cartella) in cui salveremo i file, nonchè
        // il numero di minuti entro i quali accederemo ai nostri contenuti
        // in cache prima di rigenerarli
        function inizio($percorso, $minuti)
        {
            // Imposto/recupero il percorso del file che andrò a salvare
            // nella cartella che intendo gestire come deposito della cache
            $this->nome = $percorso . "/" . md5($_SERVER["REQUEST_URI"]) . ".inc";
            // Verifico l'esistenza del file, quindi lo creo solo dopo che 
            // sia trascorso il tempo che ho impostato in fase di chiamata alla classe
            if (file_exists($this->nome) && (filemtime($this->nome) + ($minuti * 60)) > time())
            {
                include($this->nome);
            }
            else
            {
                $this->memoria = true;
                ob_start();
            }
        }
        // Definisco la chiusura delle operazioni, creando il file che sarà incluso
        // al posto del contenuto PHP che, in precedenza, ho definito "complesso o pesante",
        // che non voglio eseguire ogni volta specialmente se si tratta di un contenuto
        // statico come il testo di un articolo o di una notizia
        function fine()
        {
            if ($this->memoria)
            {
                $contenuto = ob_get_clean();
                echo $contenuto;
                $apri = fopen($this->nome, "w");
                fwrite($apri, $contenuto);
                fclose($apri);
            }
        }
    }
?>

Come si può evincere dai commenti all'interno della classe, quel che abbiamo creato è un sistema che ad una prima connessione esegue lo script, salva l'output in un file di inclusione (.inc nel mio esempio, ma più essere anche .txt o .html) ed include quest'ultimo nel punto della pagina in cui viene eseguito.

Allo scadere del tempo impostato, lo script verrà eseguito di nuovo al primo accesso per riprendere il "giro" ed alleggerire il carico di lavoro della macchina.

Esempio di utilizzo della classe "cache"

Personalmente trovo più utile mettere in cache solo una porzione di pagina e non la pagina intera, in modo da avere sempre il controllo del resto della pagina, partendo dal presupposto che gli altri script non sono pesanti e, per di più, ho la mia convenienza a farlo eseguire ogni volta (rotazione pubblicitaria, contatore di accessi e così via).

Allo scopo creiamo sul nostro server la cartella cache nella posizione del file di esempio che andiamo ad eseguire, ad esempio cache.php. Lanciamo quindi il nostro browser all'indirizzo:

http://localhost/cache.php

e corrediamo il suddetto file col seguente codice:

<?PHP
    include("cache.inc");
?>
<html>
<body>

<p>QUALCOSA PRIMA</p>

<?PHP
    $tmp = new cache();
    $tmp->inizio("cache", 1);
    // Scriveremo il nostro codice "pesante o complesso" all'interno di questa condizione
    if ($tmp->memoria)
    {
        echo "<p>" . date("d/m/Y H.i.s") . "</p>";
    }
    $tmp->fine();

?>

<p>QUALCOSA DOPO</p>

</body>
</html>

Il caching, per com'è impostato all'interno del metodo inizio(), agisce per 1 minuto e salva nella cartella cache il file che includeremo in quella posizione di pagina.

Per testare il funzionamento, si provi ad aggiornare la pagina nell'arco del minuto che inizia dall'esecuzione della pagina stessa, quindi si provi ad aggiornare la pagina quando il minuto sarà trascorso.

I più cliccati della sezione Php

:: Redirect in Php (101.554)

:: Upload di file in Php (32.016)

:: Refresh temporizzato in PHP (26.275)

:: Scrivere il codice di sicurezza CAPTCHA in Php (25.646)

:: Un carrello della spesa in PHP (21.420)

:: Creare un menu dinamico in Php (20.146)

:: Pagamenti online con PayPal e PHP (16.883)

:: Convertire una stringa in maiuscolo e in minuscolo in Php (15.481)

:: Inviare email in formato Html con Php (15.124)

:: Ottenere le dimensioni di un'immagine con PHP (14.318)

IN EVIDENZA
DOWNLOAD