Gestione della cache con PHP
- Novembre 05, 2010
- by
- Donatantonio
In questo articolo realizzeremo una classe PHP per gestire la cache delle nostre pagine web.
L’obiettivo sarà quello di mettere in cache una pagina intera o parte di essa per essere poi riutilizzata ad una successiva richiesta che rientri in un tempo limite da noi preventivamente scelto. Questa tecnica, sapientemente utilizzata, evita l’esecuzione di script “pesanti” che vengono richiamati frequentemente, soprattutto qualora i dati rappresentati non subiscono variazioni nel breve termine.
La classe phpCache avrà i seguenti metodi:
- start() – Per avviare il processo di cache della pagina
- stop() – Per concludere il processo di cache della pagina
- paginaCorrente() – Per prelevare il nome della pagina corrente
Inoltre il costruttore della classe acquisisce due parametri:
- Il periodo di validità di un file in cache (espresso in minuti)
- Il percorso relativo per la cartella di cache
In fondo all’articolo è possibile provare e scaricare il codice completo.
Vediamo subito il codice della classe PhpCache:
<?php class PhpCache{ var $durata; var $cache_url; var $nome_pagina; /* Costruttore - i parametri sono: i minuti di vita della cache e il percorso della cartella di cache */ function PhpCache($minuti,$percorso){ $this->durata = intval($minuti) * 60; $this->cache_url = $percorso; } // Funzione di start della cache function start(){ // Start dell'output buffer ob_start(); // prelevo il nome della pagina attuale e creo il percorso nella cache $this->nome_pagina = $this->cache_url."".$this->paginaCorrente(); /* se il file esiste in cache e la versione è ancora valida rispetto al tempo di vita allora includo il file in cache e non vado oltre */ if (file_exists($this->nome_pagina) && ((time() - $this->durata) < filemtime($this->nome_pagina))) { include($this->nome_pagina); exit; } } // Funzione di stop della cache function stop(){ // Scriviamo il contenuto del buffer nel file di cache $file = fopen($this->nome_pagina, 'w'); fwrite($file, ob_get_contents()); fclose($file); // Chiudiamo il buffer ob_end_flush(); } // Metodo che restituisce il nome della pagina [eventuali parametri compresi] function paginaCorrente() { $pagina_corrente = $_SERVER["SERVER_NAME"].$_SERVER['REQUEST_URI']; $pezzi = explode("/",$pagina_corrente); $pagina_corrente = $pezzi[count($pezzi)-1]; return $pagina_corrente; } } ?>
Per capire come funziona questa classe possiamo innanzitutto dire che:
tutto il codice compreso tra la chiamata al metodo start() e la chiamata al metodo stop() viene messo in cache
Lo start() ha innanzitutto il compito di aprire un buffer di output (ob_start()) in modo da convogliare tutto il codice di echo e html in una unica variabile, inoltre verificare se la pagina richiesta sia già presente in cache e sia ancora valida:
ob_start(); $this->nome_pagina = $this->cache_url."".$this->paginaCorrente(); if (file_exists($this->nome_pagina) && ((time() - $this->durata) < filemtime($this->nome_pagina))) { include($this->nome_pagina); exit; }
A tale scopo è di supporto il metodo paginaCorrente() che restituisce il nome della pagina richiesta, compreso di eventuali parametri in GET.
Il metodo di stop() ha il compito di salvare il contenuto del buffer nel file in cache, in modo tale che ad una nuova apertura della pagina il metodo di start() possa verificarne la presenza.
La classe va utilizzata quindi nel seguente modo:
require_once('phpCache.php'); $cache = new PhpCache(10,'cache/'); $cache->start(); // segue il codice php/html // ... $cache->stop();
Nel costruttore abbiamo, ad esempio, scelto di rendere validi i file in cache per 10 minuti e salvare quest’ultimi in una cartella denominata cache/.
In conclusione è possibile scaricare e provare il codice. A tal proposito si consiglia di verificare il salvataggio in cache della pagina d’esempio controllando l’orario che questa stampa a video.
Cliccando qui è possibile vedere in azione il codice.
Cliccando qui è possibile scaricare il codice.