borrame.com - Colección particular de recortes de código y documentación para programación web

Lo más fresco

  1. Cadena aleatoria en PHP (¡ahora también multi-byte!) Modificado
  2. Cookies en JavaScript Modificado
  3. Reiniciar Apache con cuidado (graceful restart) Modificado

Sugerencias del chef

Lo más visitado

  1. Dar formato a un número
  2. Fecha y hora
  3. Cookies
  4. Rotar logs en Windows
  5. Reiniciar Apache con cuidado (graceful restart)

Caché del navegador

Guardar en caché

A menudo se emplea PHP simplemente para añadir menús, encabezados o pies de página usando el tradicional include(). Un efecto secundario es que al tratarse de un script en PHP la página ya no se guarda en la caché del navegador y se descarga desde Internet cada vez que se visualiza; sieeeempre la misma página porque nada cambia en ella de una vez a otra.

Con esta función, llamada al principio de nuestro script, le indicamos al navegador la fecha real de la última modificación y cuánto tiempo debe conservar la página en caché.

/*
 * Genera los encabezados necesarios para indicar que el documento se guarde o no en caché
 */

function cache($activar, $horas=3){ //v2009-05-08
    if($activar){
        // Guardar en caché
        session_cache_limiter('private'); // Controlamos los encabezados de session_start()
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s', getlastmod()) . ' GMT');
        header('Expires: ' . gmdate('D, d M Y H:i:s', time()+60*60*$horas) . ' GMT');
        header('Cache-Control: max-age=' . 60*60*$horas . ', s-maxage=' . 60*60*$horas . ', must-revalidate, proxy-revalidate');
    }else{
        // No guardar en caché
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()-86400*365*10) . ' GMT');
        header('Expires: ' . gmdate('D, d M Y H:i:s', time()-86400*365*10) . ' GMT');
        header('Cache-Control: no-store, no-cache, must-revalidate');
        header('Cache-Control: post-check=0, pre-check=0', FALSE);
        header('Pragma: no-cache');
    }
}

Nótese que esto no nos impide recargar la página con el botón de actualizar y, en cambio, hace mucho más ágil navegar por el sitio.

No guardar en caché

Si no queremos reutilizar la página de la caché podemos llamar a la función con $activar=FALSE. O podemos simplemente no llamarla: ésa acostumbra a ser configuración predeterminada de PHP.

Notas y sugerencias

Historial

v2009-05-08
Agrupado el código en una función y actualizadas las explicaciones.
La caché no se activaba en páginas con sesiones.
v2005-08-25
Primera versión.

Esta página ha sido impresa el jueves 29 de julio de 2010 (21:26:39 +0200) desde http://borrame.com/recortes/php/cache-navegador.html. La última vez que miré contenía HTML válido con CSS fresquito y si tiene flatas de ortografía ha sido sin querer.

borrame.com es el sitio anteriormente conocido como bits.demogracia.com (no confundir con Demogracia, que sólo pasaba por ahí).

© 2005-2010 by Álvaro G. Vicario (alvaro.es) • Burgos (España) • borrame.com