Caching Instagram API requests using PHP?

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

Here's my current script that does the API calling:

 $client = "55447265ed444bb5b768ecb0765ba9cb";    $query = $_POST['q'];    $clnum = mt_rand(1,3);   $api = "https://api.instagram.com/v1/tags/".$query."/media/recent?client_id=".$client;     function get_curl($url) {  if(function_exists('curl_init')) {     $ch = curl_init();     curl_setopt($ch, CURLOPT_URL,$url);     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     curl_setopt($ch, CURLOPT_HEADER, 0);     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);      $output = curl_exec($ch);     echo curl_error($ch);     curl_close($ch);     return $output; } else{     return file_get_contents($url); }  }   $response = get_curl($api);  $images = array();   if($response){ foreach(json_decode($response)->data as $item){          $src = $item->images->standard_resolution->url;     $thumb = $item->images->thumbnail->url;     $url = $item->link;      $images[] = array(     "src" => htmlspecialchars($src),     "thumb" => htmlspecialchars($thumb),     "url" => htmlspecialchars($url)     );  }  }   print_r(str_replace('\\/', '/', json_encode($images)));  die(); 

I found 2 codes that can do caching but need help integrating them into my current script. One script is longer than the other. Both scripts do a $cache variable followed by an "if, else" code then they both branch out into different codes. The 2nd code is really similar to my current script but trying to figure out how to merge them.

1st code:

// Also Perhaps you should cache the results as the instagram API is slow $cache = './'.sha1($url).'.json'; if(file_exists($cache) && filemtime($cache) > time() - 60*60){     // If a cache file exists, and it is newer than 1 hour, use it     $jsonData = json_decode(file_get_contents($cache)); } else {     $jsonData = json_decode((file_get_contents($url)));     file_put_contents($cache,json_encode($jsonData)); }  $result = '<div id="instagram">'.PHP_EOL; foreach ($jsonData->data as $key=>$value) {     $result .= "\t".'<a class="fancybox" data-fancybox-group="gallery"                          title="'.htmlentities($value->caption->text).' '.htmlentities(date("F j, Y, g:i a", $value->caption->created_time)).'"                         style="padding:3px" href="'.$value->images->standard_resolution->url.'">                       <img src="'.$value->images->low_resolution->url.'" alt="'.$value->caption->text.'" width="'.$width.'" height="'.$height.'" />                       </a>'.PHP_EOL; } $result .= '</div>'.PHP_EOL; return $result; } 

2nd code:

 $cache = './cache.json';   if(file_exists($cache) && filemtime($cache) > time() - 60*60){ // If a cache file exists, and it is newer than 1 hour, use it $images = json_decode(file_get_contents($cache),true); //Decode as an json array  }    else{   // Make an API request and create the cache file  // For example, gets the 32 most popular images on Instagram   $response = get_curl($api); //change request path to pull different photos    $images = array();  if($response){     // Decode the response and build an array     foreach(json_decode($response)->data as $item){          $title = (isset($item->caption))?mb_substr($item->caption->text,0,70,"utf8"):null;          $src = $item->images->standard_resolution->url; //Caches standard res img path to variable $src          //Location coords seemed empty in the results but you would need to check them as mostly be undefined         $lat = (isset($item->data->location->latitude))?$item->data->location->latitude:null; // Caches latitude as $lat         $lon = (isset($item->data->location->longtitude))?$item->data->location->longtitude:null; // Caches longitude as $lon          $images[] = array(         "title" => htmlspecialchars($title),         "src" => htmlspecialchars($src),         "lat" => htmlspecialchars($lat),         "lon" => htmlspecialchars($lon) // Consolidates variables to an array         );     }     file_put_contents($cache,json_encode($images)); //Save as json }  }   //Debug out  print_r($images);   //Added curl for faster response  function get_curl($url){ if(function_exists('curl_init')){     $ch = curl_init();     curl_setopt($ch, CURLOPT_URL,$url);     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     curl_setopt($ch, CURLOPT_HEADER, 0);     curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);     curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);      $output = curl_exec($ch);     echo curl_error($ch);     curl_close($ch);     return $output; }else{     return file_get_contents($url); }   } 

回答1:

I used below code which is taken from your provided code and it seems to be working fine..

<?php     $client = "55447265ed444bb5b768ecb0765ba9cb";   $query = $_POST['q'];   $clnum = mt_rand(1,3);  $api = "https://api.instagram.com/v1/tags/".$query."/media/recent?client_id=".$client;    function get_curl($url) {     if(function_exists('curl_init')) {         $ch = curl_init();         curl_setopt($ch, CURLOPT_URL,$url);         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);         curl_setopt($ch, CURLOPT_HEADER, 0);         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);          $output = curl_exec($ch);         echo curl_error($ch);         curl_close($ch);         return $output;     } else{         return file_get_contents($url);     } }  $images = array();  $cache = './cache.json';  if(file_exists($cache) && filemtime($cache) > time() - 60*60){     // If a cache file exists, and it is newer than 1 hour, use it     $images = json_decode(file_get_contents($cache),true); //Decode as an json array } else {     // Make an API request and create the cache file     // For example, gets the 32 most popular images on Instagram     $response = get_curl($api); //change request path to pull different photos      $images = array();      if($response){         // Decode the response and build an array         foreach(json_decode($response)->data as $item){              $title = (isset($item->caption))?mb_substr($item->caption->text,0,70,"utf8"):null;              $src = $item->images->standard_resolution->url; //Caches standard res img path to variable $src              //Location coords seemed empty in the results but you would need to check them as mostly be undefined             $lat = (isset($item->data->location->latitude))?$item->data->location->latitude:null; // Caches latitude as $lat             $lon = (isset($item->data->location->longtitude))?$item->data->location->longtitude:null; // Caches longitude as $lon              $images[] = array(                 "title" => htmlspecialchars($title),                 "src" => htmlspecialchars($src),                 "lat" => htmlspecialchars($lat),                 "lon" => htmlspecialchars($lon) // Consolidates variables to an array             );                     file_put_contents($cache,json_encode($images)); //Save as json         }     }      }  //Debug out echo "<pre>"; print_r($images); 


回答2:

Yeah this works. But u need to use the cache function because the instagram api is really slow. It doesn't matter if u take curl or file_get_contents.... the fastes way is jquery. Jquery uses the client machine php the server.. and if ure server stands away from the api servers so it takes time.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!