Cache de páginas en PHP

Una de las técnicas mas utilizadas para optimizar los recursos de un servidor web es el uso de cache de páginas, esto es crear copias estáticas de nuestras páginas dinámicas para posteriormente entregárselas al usuario, con esto solo la primera vez en la que se genera nuestra copia cache se harán las consultas a base de datos, cálculos, procesamiento, entre otros de nuestra web, en las siguientes ocasiones al usuario se le entregará la copia cache con lo cual ahorramos recursos de servidor.

Créditos
Este ejemplo esta basado en el articulo Caching of output in PHP escrito por Dave Child, al cual le hize algunas modificaciones con el objeto de ser mas didáctico.

Funcionamiento
Para hacer cache de nuestras páginas utilizaremos dos archivos cache.start.php que verificará si existe una copia en cache de la pagina en cuyo caso lo mostrará al usuario y cache.end.php que se encargará de crear el cache del página seleccionada.

Escribiendo los scripts
Entonces lo primero es crear el archivo cache.start.php en donde primero definimos la carpeta donde guardaremos los archivos de cache, el tiempo de expiración de estos archivos y la extensión de estos archivos. El siguiente paso es crear el nombre del archivo, esto lo hacemos basado en el nombre original del archivo y aplicándole encriptación MD5.


Notar que si el archivo aun no ha expirado, le mostramos al usuario la copia que tenemos en cache y cancelamos la ejecución del resto del script.

El siguiente paso es crear el archivo cache.end.php, este archivo se ejecutará si y solo asi el script llega al final, lo cual indica que aun no tiene una copia en cache, para ello creamos el archivo y dentro del mismo escribimos el contenido del buffer.

// Generamos el nuevo archivo cache
$fp = @fopen($cachefile, 'w');
// guardamos el contenido del buffer
@fwrite($fp, ob_get_contents());
@fclose($fp);
ob_end_flush();

Modo de Utilización
El uso de este método de cache es sencillo, primer debemos crear la carpeta donde se guardarán los archivos de cache y luego incluir cache.start.php al inicio y cache.end.php al final del script a procesar.

<?php include("cache.start.php"); ?>
<html>
...
</html>
<?php include("cache.end.php"); ?>

Pueden ver un ejemplo funcionando en /caching/php-mysql.php el cual devuelve registros de una base de datos. Este sencillo script no permitirá optimizar el rendimiento de nuestras paginas dinámicas, no evitaremos múltiples conexiones a base de datos y calculo repetitivo, esto es muy útil sobre todo si utilizamos hosting compartido.

Comentarios Total 17 comentarios

Matias
Publicado: 23/04/2008 12:22 pm

Muy interesante realmente muy interesante, se agradece.

Hola
Publicado: 24/04/2008 10:13 pm

Ya existen sistemas de cache mucho mejor con Templates el oficial de la gente que trabaja en php http://smarty.php.net
Otras altenativas
http://www.phpxtemplate.org

jj
Publicado: 25/04/2008 9:47 am

lo siento, no entiendo cual es cada fichero. Podrías poner para descarga los ficheros start/end…gracias?

saludos!

Oscar
Publicado: 03/03/2009 12:57 pm

Hola,

he visto un problema con este sistema y es que los navegadores no cachean los que va entre cache_start y cache_end.

Saben cómo se podría solucionar?

SAREM
Publicado: 18/10/2009 3:09 pm

las paginas cacehadas y que ya vencieron ya no se leen con redfile() entonces pasa a crear un archivo con fwrite pero ese archivo ya existe
entones solo lo sobrescribe supongo
pero que pasaria si dos usurarios intentan sobreescribir el
mismo archivo ??????

una salida seria usar flock() ;
pero mi experiencia dice que no es la mejor porque tambien genera conflictos y sobre todo perdida de datos
Entonces cual seria una solucion ..?
haber si me puedes ayudar con esta duda

dragonnegro
Publicado: 22/11/2009 8:05 pm

Una pregunta, el tiempo de cache, no aclaras si es en milisegundos o segundos. Un abrazo.

unijimpe
Publicado: 22/11/2009 11:05 pm

Dragonnegro el tiempo esta expresado en segundos, entonces el tiempo de cache que figura en el ejemplo 86400 equivale a 24 horas o 1 día. Este tiempo lo debes configurar dependiendo de que tanto cambia el contenido de tu web.

Luis
Publicado: 29/11/2009 9:12 pm

Unijimpe en la pagina que muestra este script … tambien explica como limpiar el cache, pero lo quize usar y no funciona, o no se que hice mal

Juan
Publicado: 08/03/2011 2:57 pm

A mi no me escribe nada en la carpeta cache. Porque puede ser? los archivos start y end se ejecutan bien pero no me escribe nada, ¿cual es el problema?

Juan
Publicado: 09/03/2011 9:47 am

Hay que tener permisos sobre la carpeta cache sino no puede escribir.

En una página tengo un formulario y si utilizo este sistema de cache no me funciona ese formulario, ¿por qué puede ser?

Rubén
Publicado: 23/03/2011 3:25 pm

Si uso esto en mi página web, y actualizo la misma día a dia, ¿A las personas que entren se les vera la web actualizada, o una copia?.

Un saludo

unijimpe
Publicado: 23/03/2011 9:33 pm

Rubén, el script verifica la fecha de modificación del archivo y lo compara con la copia en cache que tiene y si es diferente crea una nueva como cache, entonces si cambias la pagina diariamente, hará una copia en cache cada dia con lo cual no tendrás problemas.

NetBok95
Publicado: 05/10/2011 11:39 am

Esta, bueno, me ayudo mucho, lo integre a mi website, y me ayudo muxo, gracias pibes !!! :D

Alejandro
Publicado: 22/11/2011 12:12 am

Pensaba crear un sistema de cache y me faltaban algunas ideas las cuales las saqué de este artículo. Si bien no lo voy a usar tal cual me sirve y mucho, gracias por el aporte.

Jonnathan Silva
Publicado: 06/01/2012 10:00 pm

no logro entender muy bien el codigo, puedo usar un metido que sea mas practico?

jose suarez
Publicado: 23/08/2012 5:15 pm

exelente tema me a solucionado el porblema uqe tenia de mi pagina lenta

dhamaso
Publicado: 21/10/2012 6:51 pm

Gracias, por la explicacion , solo tengo una duda; Para que sirve este codigo o como funciona ??

@clearstatcache();

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)