【问题标题】:Caching Instagram API requests using PHP?使用 PHP 缓存 Instagram API 请求?
【发布时间】:2013-12-13 02:29:19
【问题描述】:

这是我当前执行 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);
}

 }

【问题讨论】:

  • @kwollaston - 不幸的是,不确定如何将 ETags 放入代码中。我只是在查看我的代码和其他 2 个代码。

标签: php json curl instagram


【解决方案1】:

我使用了以下代码,该代码取自您提供的代码,它似乎工作正常..

<?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】:

    是的,这行得通。但是你需要使用缓存功能,因为 instagram api 真的很慢。 如果你采取 curl 或 file_get_contents 都没关系......最快的方式是 jquery。 Jquery 使用客户端机器 php 服务器.. 如果 ure 服务器远离 api 服务器,那么它需要时间。

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 1970-01-01
      • 2021-07-23
      • 2018-11-09
      • 2021-01-15
      • 2016-12-16
      • 2021-10-13
      • 1970-01-01
      • 2015-04-12
      相关资源
      最近更新 更多