2009-10-10 15 views
11

¿cómo puedo almacenar en caché una página web en php para que si una página no se ha actualizado, los espectadores deberían obtener una copia en caché?¿Cómo guardo en caché una página web en PHP?

Gracias por su ayuda. PD: Soy principiante en php.

+0

¿Está utilizando algún marco como Zend Framework? Danos más detalles! – Thomaschaaf

+1

No estoy usando ningún marco. – user187580

+0

es posible que desee considerar moverlo a un marco. http://code.google.com/p/samstyle-php-framework: marco completo que incluye caché de archivos y admite memcache – mauris

Respuesta

13

En realidad, puede guardar el resultado de la página antes de finalizar el script, y luego cargar el caché al inicio del script.

código de ejemplo:

<?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); 

?> 

Si usted tiene un montón de páginas que necesitan este almacenamiento en caché se puede hacer esto:

en 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(); 
?> 

en cacheend.php:

<?php 

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

?> 

Luego simplemente agregue

include('cachestart.php'); 

al inicio de sus scripts. y agregue

include('cacheend.php'); 

al final de sus scripts. Recuerde tener una carpeta llamada caché y permitir que PHP acceda a ella.

Recuerde también que si está haciendo una caché de página completa, su página no debe tener una visualización específica de SESSION (por ejemplo, la barra de miembros de la pantalla o qué) porque también se almacenarán en caché. Mire un marco para el almacenamiento en caché específico (variable o parte de la página).

+0

¿dónde pongo este código? index.php? – user187580

+0

notó la parte donde escribí '// toda la codificación va aquí'? puedes poner tu código principal allí. – mauris

+0

ahh ya veo. Lo probaré y verificaré. Gracias. – user187580

0

Utilice Squid o actualice los encabezados HTTP correctamente para realizar el almacenamiento en caché del navegador. No veo la necesidad de girar su propia versión del almacenamiento en caché según la pregunta.

4

Adicionalmente a la respuesta mauris me gustaría señalar esto:

Hay que tener cuidado cuando se utiliza el almacenamiento en caché. Cuando tiene datos dinámicos (que debería ser el caso cuando usa php en lugar de html estático), debe invalidar la caché cuando cambian los datos correspondientes.

Esto puede ser bastante fácil o extremadamente complicado, dependiendo de su tipo de datos dinámicos.

actualización

Cómo se invalida la memoria caché depende del tipo concreto de almacenamiento en caché. Debe saber qué archivos de caché pertenecen a qué página (y tal vez con la entrada del usuario). Cuando los datos cambian, debe eliminar el archivo en caché o eliminar el resultado de la página de la estructura de datos de caché.

No puedo darle ninguna información más detallada sobre eso sin saber qué implementación utiliza para el almacenamiento en caché.

Otras personas sugirieron, por ejemplo, el paquete Pear o memcached. Estos tienen las funciones necesarias para invalidar toda la memoria caché o partes de ella cuando los datos cambian.

+0

por favor arroje algunas ideas más sobre la invalidación de la memoria caché ... gracias. – user187580

+0

@Patrick, En realidad, el almacenamiento en caché requiere acceso al disco duro. ¿No sería más lento entonces? – Pacerier

+0

Bueno, generalmente el sistema operativo tiene su propio caché de archivos, por lo que incluso si usa archivos, puede que se sirva desde la memoria. pero aunque no lo es, la mayoría de las veces es más eficiente leer el resultado en caché del disco y devolverlo que volver a calcular la página. Si es más rápido calcularlo, entonces no caché. –

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

correcta es

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

de lo contrario el script no funcionará.

Cuestiones relacionadas