php - soporta - optimizar consultas mysql explain
Almacenamiento en caché de la salida JSON en PHP (2)
Tengo un pequeño problema. He estado jugando con las API de Facebook y Twitter y obteniendo la salida JSON de las consultas de búsqueda de estado sin problemas, sin embargo, he leído más y me di cuenta de que podría terminar siendo "limitado por la tasa" como se cita en la documentación.
Me preguntaba ¿es fácil guardar en caché la salida JSON cada hora para que al menos pueda intentar evitar que esto suceda? ¿Si es así, Cómo se hace? Como probé un video de Youtube, pero realmente no me proporcionó mucha información, solo escribí el contenido de una lista de directorios en un archivo cache.php, pero realmente no me di cuenta si esto se puede hacer con la salida JSON y sin dudas no dijo cómo usar el intervalo de tiempo de 60 minutos o cómo obtener la información y luego volver a salir del archivo de caché.
Cualquier ayuda o código sería muy apreciado, ya que parece haber muy poco en tutoriales sobre esta cuestión.
Aquí una función simple que agrega almacenamiento en caché para obtener algunos contenidos de URL:
function getJson($url) {
// cache files are created like cache/abcdef123456...
$cacheFile = ''cache'' . DIRECTORY_SEPARATOR . md5($url);
if (file_exists($cacheFile)) {
$fh = fopen($cacheFile, ''r'');
$cacheTime = trim(fgets($fh));
// if data was cached recently, return cached data
if ($cacheTime > strtotime(''-60 minutes'')) {
return fread($fh);
}
// else delete cache file
fclose($fh);
unlink($cacheFile);
}
$json = /* get from Twitter as usual */;
$fh = fopen($cacheFile, ''w'');
fwrite($fh, time() . "/n");
fwrite($fh, $json);
fclose($fh);
return $json;
}
Utiliza la URL para identificar los archivos de caché, una solicitud repetida a la URL idéntica se leerá en la memoria caché la próxima vez. Escribe la marca de tiempo en la primera línea del archivo de caché y los datos en caché de más de una hora se descartan. Es solo un ejemplo simple y probablemente querrás personalizarlo.
Es una buena idea usar el almacenamiento en caché para evitar el límite de velocidad. Aquí hay un código de ejemplo que muestra cómo lo hice para los datos de Google+, en algún código php que escribí recientemente.
private function getCache($key) {
$cache_life = intval($this->instance[''cache_life'']); // minutes
if ($cache_life <= 0) return null;
// fully-qualified filename
$fqfname = $this->getCacheFileName($key);
if (file_exists($fqfname)) {
if (filemtime($fqfname) > (time() - 60 * $cache_life)) {
// The cache file is fresh.
$fresh = file_get_contents($fqfname);
$results = json_decode($fresh,true);
return $results;
}
else {
unlink($fqfname);
}
}
return null;
}
private function putCache($key, $results) {
$json = json_encode($results);
$fqfname = $this->getCacheFileName($key);
file_put_contents($fqfname, $json, LOCK_EX);
}
y para usarlo:
// $cacheKey is a value that is unique to the
// concatenation of all params. A string concatenation
// might work.
$results = $this->getCache($cacheKey);
if (!$results) {
// cache miss; must call out
$results = $this->getDataFromService(....);
$this->putCache($cacheKey, $results);
}