utiliza un archivo de caché local, y sólo comprobar la existencia y tiempo de modificación en el archivo antes de usarlo. Por ejemplo, si $cache_file
es un nombre de archivo caché local:
if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 60 * 5))) {
// Cache file is less than five minutes old.
// Don't bother refreshing, just use the file as-is.
$file = file_get_contents($cache_file);
} else {
// Our cache is out-of-date, so load the data from our remote server,
// and also save it over our cache for next time.
$file = file_get_contents($url);
file_put_contents($cache_file, $file, LOCK_EX);
}
(. No probado, pero basado en el código que utilizo en este momento)
cualquier manera a través de este código, archivo $ termina como los datos que Necesitará, y usará la memoria caché si está fresca, o tomará los datos del servidor remoto y actualizará la memoria caché si no es así.
EDIT: Entiendo un poco más sobre el bloqueo de archivos desde que escribí lo anterior. Puede valer la pena leer this answer si le preocupa el bloqueo de archivos aquí.
Si usted está preocupado por el bloqueo y el acceso concurrente, yo diría que la solución más limpia sería file_put_contents a un archivo temporal , a continuación, se rename()
sobre $cache_file
, que debería ser una operación atómica, es decir, la voluntad $cache_file
ya sea el contenido antiguo o el contenido completamente nuevo, nunca escrito a medio camino.
Gracias por el código Matt! ¡Es súper limpio, bien comentado y funciona sin modificaciones! – zsero
@zsero Cool. Pero ponga un error al verificar allí :) Es posible que tenga problemas si el usuario del servidor web no puede escribir en el directorio de caché, por ejemplo ... –
Sí, podría necesitar una comprobación de error, pero es un proyecto tan pequeño que hay nadie más usará o desplegará este código. Y si está roto, la parte else entra en modo caché, en lugar de frenar. Bonito. – zsero