Ciao
Qualche giorno fa avevo gią aperto una discussione simile postando uno script che generava cache file compressi in gzip di tutte le pagine del sito salvandoli in una cartella del server ma io stesso non capivo il problema. Adesso ho isolato il problema.
In breve visiti index.php e nella cartella "cache" viene salvato l'output utilizzando la funzione ob_start(). Quando si torna sulla pagina, se questa non č scaduta, viene mostrato il file in cache senza interrogare nč apache nč il database. Se invece č scaduta la pagina viene rigenerata e la cache aggiornata (sovrascritta). Questo č lo script che viene incluso in cima a tutte le pagine prima di tutto (e in fondo a tutto c'č ob_end_flush()
Codice PHP:
// stabilisco la cartella dove salvare i cache file
define('CACHE_PATH', "./cache/");
// stabilisco dopo quanti secondi la cache scade
define('CACHE_TIME', 10);
// stabilisco come deve essere nominato il file di cache. sostituisco gli "/" con "-" ed elimino
// l'estensione php. in altre parole "cartella/index.php" diventa "cartella-index"
$clear_slash = str_replace("/","-",$_SERVER['REQUEST_URI']);
$clear_path = str_replace(".php","",$clear_slash);
define ('CLEAR_PATH', "$clear_path");
// questa funzione in effetti č inutile comunque sia mi converto "cartella-index" sopra
// ricavato in md5 e lo antepongo a sč stesso in chiaro. praticamente diventa
// "a427b6889a89100fd6a4b9f0f7641b73-cartella-index"
function cache_file()
{
return CACHE_PATH . md5($_SERVER['REQUEST_URI']) . CLEAR_PATH;
}
// visualizzo il file in cache se questo esiste e non č scaduto
function cache_display()
{
$file = cache_file();
// controllo che il file in cache esiste e non č scaduto
if(!file_exists($file)) return;
if(filemtime($file) < time() - CACHE_TIME * 1) return;
// se non č scaduto lo visualizzo e fermo il processo
echo gzuncompress(file_get_contents($file));
exit;
}
// altrimenti continuo e scrivo il file in cache
function cache_page($content)
{
if(false !== ($f = @fopen(cache_file(), 'w'))) {
fwrite($f, gzcompress($content));
fclose($f);
}
return $content;
}
// se un cache file valido viene trovato l'esecuzione dello script si ferma qui
cache_display();
// altrimenti abilito il buffering dell'output e creo il file cache
ob_start('cache_page');
Il problema č che quando la cache deve essere aggiornata perchč č scadura questo non avviene o meglio la cache si aggiorna solo se aggiorno pagina (F5), se chiudo il tab e torno a visitare la pagina o infine se nella barra degli indirizzi posiziono il cursore e premo invio (che poi bene o male sono tutti e 3 dei refresh).