2013-12-13 3 views
0

Вот мой текущий сценарий, который делает API призвания:Кэширование запросов API Instagram с использованием 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); 
} 
} 

$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 стоит от серверов api, это требует времени.

Смежные вопросы