2009-10-10 18 views
11

Come posso memorizzare una pagina Web in PHP in modo che se una pagina non è stata aggiornata, gli spettatori dovrebbero ottenere una copia nella cache?Come posso memorizzare in cache una pagina Web in PHP?

Grazie per il vostro aiuto. PS: sono principiante in php.

+0

Si sta utilizzando un framework come Zend Framework? Dacci maggiori dettagli! – Thomaschaaf

+1

Non sto usando nessun framework. – user187580

+0

potresti prendere in considerazione di spostarlo in un framework. http://code.google.com/p/samstyle-php-framework - framework completo che include il caching dei file e supporta memcache – mauris

risposta

13

È possibile effettivamente salvare l'output della pagina prima di terminare lo script, quindi caricare la cache all'inizio dello script.

codice di esempio:

<?php 

$cachefile = 'cache/'.basename($_SERVER['PHP_SELF']).'.cache'; // e.g. cache/index.php.cache 
$cachetime = 3600; // time to cache in seconds 

if(file_exists($cachefile) && time()-$cachetime <= filemtime($cachefile)){ 
    $c = @file_get_contents($cf); 
    echo $c; 
    exit; 
}else{ 
    unlink($cachefile); 
} 

ob_start(); 

// all the coding goes here 

$c = ob_get_contents(); 
file_put_contents($cachefile); 

?> 

Se si dispone di un sacco di pagine che necessitano di questo caching si può fare questo:

in cachestart.php:

<?php 
$cachefile = 'cache/'.basename($_SERVER['PHP_SELF']).'.cache'; // e.g. cache/index.php.cache 
$cachetime = 3600; // time to cache in seconds 

if(file_exists($cachefile) && time()-$cachetime <= filemtime($cachefile)){ 
    $c = @file_get_contents($cf); 
    echo $c; 
    exit; 
}else{ 
    unlink($cachefile); 
} 

ob_start(); 
?> 

in cacheend.php:

<?php 

$c = ob_get_contents(); 
file_put_contents($cachefile); 

?> 

Poi basta semplicemente aggiungere

include('cachestart.php'); 

all'inizio di script. e aggiungi

include('cacheend.php'); 

alla fine dei tuoi script. Ricordarsi di avere una cartella denominata cache e consentire a PHP di accedervi.

Inoltre, ricorda che se stai facendo una cache a pagina intera, la tua pagina non dovrebbe avere una visualizzazione specifica SESSION (ad esempio visualizzare la barra dei membri o cosa) perché saranno anche memorizzati nella cache. Guarda un framework per il caching specifico (variabile o parte della pagina).

+0

dove inserisco questo codice? index.php? – user187580

+0

notato la parte in cui ho scritto '// tutta la codifica va qui '? puoi mettere il tuo codice principale lì. – mauris

+0

ahh capisco. Lo proverò e controllerò. Grazie. – user187580

0

Utilizzare Squid o aggiornare correttamente le intestazioni HTTP per fare il caching del browser. Non vedo la necessità di ruotare la propria versione di caching in base alla domanda.

4

In aggiunta alla risposta Mauris mi piacerebbe farlo notare:

Bisogna fare attenzione quando si utilizza la memorizzazione nella cache. Quando hai dati dinamici (che dovrebbero essere il caso quando usi php invece di html statico), devi invalidare la cache quando i dati corrispondenti cambiano.

Questo può essere abbastanza facile o estremamente difficile, a seconda del tipo di dati dinamici.

Aggiornamento

Come invalidare la cache dipende dal tipo di cemento di caching. Devi sapere quali file cache appartengono a quale pagina (e magari con input dell'utente). Quando i dati cambiano, è necessario eliminare il file memorizzato nella cache o rimuovere l'output della pagina dalla struttura dei dati della cache.

Non posso fornirti informazioni più dettagliate a riguardo senza sapere quale implementazione usi per la memorizzazione nella cache.

Altre persone hanno suggerito ad esempio il pacchetto Pear o memcached. Questi hanno le funzioni necessarie per invalidare l'intera cache o parti di esso quando i dati cambiano.

+0

si prega di lanciare qualche altra idea su invalidare la cache .. grazie. – user187580

+0

@Patrick, in realtà, la memorizzazione nella cache richiede l'accesso al disco rigido. Non sarebbe più lento allora? – Pacerier

+0

Bene, di solito il sistema operativo ha la propria cache di file, quindi anche se si usano i file, può essere servito dalla memoria. ma anche non lo è, è la maggior parte delle volte più performante a leggere il risultato memorizzato nella cache dal disco e restituirlo piuttosto che ricalcolare la pagina. Se è più veloce calcolarlo, quindi non memorizzare nella cache. –

3
$c = ob_get_contents(); 
file_put_contents($cachefile); 

corretta è

$c = ob_get_contents(); 
file_put_contents($cachefile,$c); 

altrimenti lo script non funzionerà.

Problemi correlati