2013-12-13 73 views
0

这里是我当前的脚本,并调用API:使用PHP缓存Instagram API请求?

$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(); 

我发现2码,可以做缓存,但需要帮助他们融入我当前的脚本。一个脚本比另一个脚本长。这两个脚本都会执行一个$ cache变量,后跟一个“if,else”代码,然后它们分支出不同的代码。第二个代码与我目前的脚本非常相似,但试图弄清楚如何合并它们。

第一代码:

// 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; 
} 

第二码:

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

} 
+0

ETags呢? – kwollaston

+0

@kwollaston - 不知道如何将ETags放入代码。我只是看着我的代码和另外两个代码。 – user2984757

回答

0

我用下面这是从你提供的代码采取代码,它似乎是工作的罚款..

<?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); 
0

是的,这是有效的。但是你需要使用缓存功能,因为instagram api真的很慢。 如果你使用curl或file_get_contents,那没关系.... fastes的方法是jQuery。 jquery使用客户机php的服务器..如果ure server远离api服务器,所以需要时间。