2012-07-10 27 views
12

Tiene 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.Almacenamiento en caché Salida JSON en PHP

Me preguntaba ¿es fácil almacenar 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 los tutoriales sobre esta cuestión.

Respuesta

26

Aquí una simple función que añade almacenamiento en caché para conseguir algunos de los 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 repiten la solicitud 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.

+0

Ese último parece lo suficientemente simple allí, pero ¿cómo lo usaría en mi sitio como. Todavía soy bastante nuevo en PHP y solo he estado aprendiendo durante el año pasado, así que perdona mi noobness. No estoy seguro de qué va en $ json =/* obtener de Twitter como de costumbre * /; parte. ¿Lo uso así: – GeordieDave1980

+0

Mi código: - 'código' $ query =" i% 20hate% 20my% 20girlfriend "; $ query = urlencode ($ query); $ url = "http://search.twitter.com/search.json?q={$query}&rpp=100&result_type=recent&lang=en"; $ tweet = file_get_contents ($ url); $ tweet_array = json_decode ($ tweet, true); foreach ($ tweet_array ['results'] as $ data) { $ profileimg = $ data ['profile_image_url']; $ postfrom = $ data ['from_user_name']; $ postfromid = $ data ['from_user_id']; $ created = $ data ['created_at']; $ message = $ data ['text']; – GeordieDave1980

+0

He dejado un comentario con mi código, no estaba seguro de cómo ponerlo en el cuadro de comentarios, con suerte podrá copiarlo, pegarlo y separarlo para que sepa cómo se ve. Estoy un poco confundido en cuanto a qué hacer con la función. – GeordieDave1980

4

Es una buena idea utilizar 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 utilizarlo:

 // $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); 
     } 
+0

¿Cuál es el código de getCacheFileName ($ key)? – simpatico

Cuestiones relacionadas