Cacheando con PHP

Precisamente hoy terminaba una aplicación web que conecta a un servicio web pidiéndole una serie de datos sobre apuestas deportivas, sobre esos datos se realiza un tratamiento, que sin ser demasiado pesado, ralentiza algo más de la cuenta la página, si ademas tenemos en cuenta que en caso de que el tráfico sea alto podemos sobrecargar excesivamente el servidor, al final he optado por un modelo de cache bastante sencillo.

Cuando se utiliza PHP como un módulo de Apache se pueden cambiar ciertos ajustes de configuración usando directivas en los ficheros de configuración de Apache, como por ejemplo los ficheros .htaccess
En este caso las directivas que nos interesan son auto_prepend_file y auto_append_file, cito textualmente:


auto_prepend_file string Especifica el nombre del fichero que será analizado automáticamente antes del fichero principal. El fichero es incluido como si fuera llamado con la función require, por lo que se usa include_path.
El valor especial none desactiva esta directiva.
auto_append_file string Especifica el nombre del fichero que será analizado automaticamente después del fichero principal. El fichero es incluido como si fuera llamado con la función require, por que se utiliza include_path.
El valor especial none desactiva el esta directiva.
NotaSi el script finaliza con exit(), está funcionalidad no será llevada a cabo.


Con esta pequeña introducción teórica podemos ponernos manos en la masa.
Lo primero que hacemos es crear un fichero .htaccess con el siguiente contenido:

php_value auto_prepend_file "./auto_prepend_file.php"
php_value auto_append_file "./auto_append_file.php"


A continuación creamos los archivos auto_prepend_file.php y auto_append_file.php y también creamos una carpeta cache_files, que será donde almacenaremos las "imagenes" que iremos almacenando.
El contenido del fichero auto_prepend_file.php sería el siguiente:

<?php
//Config values
$cacheConfig_Directory = "./cache_files/";
$cacheConfig_Interval = 300; //keep cache files for 300 seconds (5 min)

$self = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$cacheGeneratedlink = $cacheConfig_Directory.md5($self).".htm";

if (file_exists($cacheGeneratedlink)) {
 $cachelink_time = filemtime($cacheGeneratedlink);
 if ((time() - $cacheConfig_Interval) < $cachelink_time) { 
  readfile($cacheGeneratedlink);
  die(); 
 }
}
ob_start();
?>

Yel contenido del fichero auto_append_file.php quedaría de la siguiente manera:

$fp = fopen($cacheGeneratedlink, 'c');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
?>


¿Que hemos conseguido con todo esto?

Lo que hemos conseguido al seguir estos pasos ha sido:
  1. auto_prepend_file.php se va a leer antes que cualquier petición php, aquí se calcula el md5 de la petición  y se comprueba que en $cacheConfig_Directory no exista ya un fichero con ese nombre, y que no lleve creado más de $cacheConfig_Interval, en caso de ser así lo muestra por pantalla finalizando la ejecución.
  2. En caso de que no se cumplan las condiciones anteriores, se ejecuta la petición original pero se almacena la salida en el buffer de salida mediante el comando ob_start().
  3. Una vez finalizada la ejecución, se guarda la salida en el fichero correspondiente y se muestra por pantalla.
Como se puede comprobar, este método es bastante sencillo y permite multitud de mejoras, osea que espero que sea de utilidad.
Por si a alguno lo interesa, el culpable de todo esto está aquí mientras se mantenga en pruebas. 


Más información:
http://php.net/manual/es/configuration.changes.php
http://php.net/manual/es/ini.core.php

No hay comentarios:

Publicar un comentario