使用PHP缓存Instagram API请求? [英] Caching Instagram API requests using PHP?

查看:154
本文介绍了使用PHP缓存Instagram API请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我目前执行API呼叫的指令码:

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

我发现两个代码可以做缓存,但需要帮助将它们集成到我的当前脚本。一个脚本比另一个脚本长。这两个脚本做一个$ cache变量后面跟一个if,else代码,然后他们都分支到不同的代码。

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.

第一个代码:

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

 }


推荐答案

我使用下面的代码,这取自你提供的代码,它似乎工作正常..

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

这篇关于使用PHP缓存Instagram API请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆