Cacher un fichero de una fuenta de datos cada 15 minuto en PHP

5/5 - (2 votos)

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

Deja un comentario