A la hora de tratar fichero de una fuente de datos online, se puede dar la situación que necesitemos cachear la fuente de datos original, para no saturarlo a peticiones.
Para solucionar esto, voy a explicarlos como hacer un sistemas de cacheo que hace una copia local durante 15 minutos, o los minutos que prefirais.
Lo haremos en dos pasos:
En el primero crearemos una función que recibe la url del fichero a cachear y el nombre de como se va a llamar en nuestro sistema de fichero de forma local.
//nombre del fichero cacheado
$filename = 'file.xml';
//url del fichero a cachear a cachear
$file_to_cache = 'http://datos.gijon.es/doc/turismo/playas.xml';
//funcion que graba el fichero
function write_data_to_file( $filename, $file_to_cache ) {
$file = file_get_contents( $file_to_cache );
file_put_contents( $filename, $file );
}
En el segundo paso lo que haremos sera mediante una condición crear el fichero si no existe, y una vez creado comprobar la fecha de creación y si tiene mas de 15 minutos de antigüedad, volver a guardarlo.
//cacheamos cada 15 minutos
if ( file_exists( $filename ) ) {
$file_time = filemtime( $filename );
$expire = 900; // 900 seg. 15min.
if ( $file_time < ( time() - $expire ) ) {
// si a caducado sobreescribimos
write_data_to_file( $filename, $file_to_cache );
}
} else {
// si no existe el ficehro lo creamos
write_data_to_file( $filename, $file_to_cache );
}
Finalmente creamos una variable que sera la que se pasara con el nombre del fichero
//creamos varaible con el fichero $file_data_cache = $filename;
Para poder visualizar el fichero hemos utilizado de ejemplo la entrada leer un xml desde php y en este caso lo que haremos es en el index.php importar el fichero cacheador cache.php y llamar a la variable con el contenido del fichero $file_data_cache
//importamos progama cacheador
include('cache.php');
// leer XML validamos si el fichero online e accesible y si no abrimos el XML local
$data = simplexml_load_file($file_data_cache);
El codigo utilizado es el siguiente:
<?php
// index.php
//importamos progama cacheador
include('cache.php');
// leer XML validamos si el fichero online e accesible y si no abrimos el XML local
$data = simplexml_load_file($file_data_cache);
?>
<html>
<h1>Playas de Gijón</h1>
<?php
//bucle para recorrer los elementos del array
foreach($data as $item){
?>
<table border="1">
<tr>
<td>Nombre: </td>
<td>
<?php echo $item->nombre; ?>
</td>
</tr>
<tr>
<td>URL: </td>
<td>
<?php echo $item->url; ?>
</td>
</tr>
<tr>
<td>Descripcion: </td>
<td>
<?php echo $item->descripcion; ?>
</td>
</tr>
</table><br />
<?php
} //cerramos bucle
?>
</html>
<?php
//nombre del fichero cacheado
$filename = 'file.xml';
//url del fichero a cachear a cachear
$file_to_cache = 'http://datos.gijon.es/doc/turismo/playas.xml';
//funcion que graba el fichero
function write_data_to_file( $filename, $file_to_cache ) {
$file = file_get_contents( $file_to_cache );
file_put_contents( $filename, $file );
}
//cacheamos cada 15 minutos
if ( file_exists( $filename ) ) {
$file_time = filemtime( $filename );
$expire = 900; // 900 seg. 15min.
if ( $file_time < ( time() - $expire ) ) {
// si a caducado sobreescribimos
write_data_to_file( $filename, $file_to_cache );
}
} else {
// si no existe el ficehro lo creamos
write_data_to_file( $filename, $file_to_cache );
}
//creamos varaible con el fichero
$file_data_cache = $filename;
?>
Aqui podeis ver el ejemplo en funcionamiento -> ejemplo
Y el codigo lo podeis descargar desde aqui -> codigo
