1

APIを複数回呼び出さないようにするにはどうすればよいですか?たとえば、私がyelpのAPIを使用しようとしている場合、超過するまでの呼び出しには制限があります(その数を超えると、情報の提供を停止します)。

私に何ができる?現在、私は彼らのサイトから情報を取得するために必要なすべてのページにこれを(彼らのAPI PHPの例から)持っています:

// For example, request business with id 'the-waterboy-sacramento'
//$unsigned_url = "http://api.yelp.com/v2/business/the-waterboy-sacramento";


// For examaple, search for 'tacos' in 'sf'
//$unsigned_url = "http://api.yelp.com/v2/search?term=tacos&location=sf";

// My own code
$unsigned_url = "http://api.yelp.com/v2/search?term=".$term."";
// $term is coming from searching

// Set your keys here
$consumer_key = "some_id";
$consumer_secret = "some_id";
$token = "some_id";
$token_secret = "some_id";

// Token object built using the OAuth library
$token = new OAuthToken($token, $token_secret);

// Consumer object built using the OAuth library
$consumer = new OAuthConsumer($consumer_key, $consumer_secret);

// Yelp uses HMAC SHA1 encoding
$signature_method = new OAuthSignatureMethod_HMAC_SHA1();

// Build OAuth Request using the OAuth PHP library. Uses the consumer and token object created above.
$oauthrequest = OAuthRequest::from_consumer_and_token($consumer, $token, 'GET', $unsigned_url);

// Sign the request
$oauthrequest->sign_request($signature_method, $consumer, $token);

// Get the signed URL
$signed_url = $oauthrequest->to_url();

// Send Yelp API Call
$ch = curl_init($signed_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch); // Yelp response
curl_close($ch);

そして、私が特定のビジネスに電話をかけたいとき、これはすべてのページで行うには過剰に思えます。

4

2 に答える 2

3

私はそれを使用しませんが、一般的な答えとして、API呼び出しを減らすためにデータベースにデータをキャッシュすることを検討してください。また、特にAPIからの同じデータを必要とする同じページが複数回読み込まれる場合は、サイトのパフォーマンスが向上します。

これがファイルベースの一般的な使用の実装です

/**
* Cache friendly function call stub.
* 
* @param callback $Callback
* @param array $Arguments
* @param integer $Expiration
* @return mixed
*/
function CallFunctionAndCacheResult($Callback, array $Arguments, $Expiration = 3600){
    // Validate $Callback
    if(!is_callable($Callback)){
        trigger_error('$Callback must be a callback.', E_USER_WARNING);
        return false;
    }
    // Validate $Arguments (we need some to hash)
    if(empty($Arguments)){
        trigger_error('$Arguments cannot be empty.', E_USER_WARNING);
        return false;
    }
    // Empty $Expiration means live calls
    if(empty($Expiration)){
        return call_user_func_array($Callback, $Arguments);
    }
    // Validate $Expiration (we need some to hash)
    if(!is_numeric($Expiration) or (($Expiration = intval($Expiration)) < 1)){
        trigger_error('$Expiration has to be a positive integer.', E_USER_WARNING);
        return false;
    }
    // Hash the Arguments (Unique Call ID)
    $Hash = md5(serialize($Arguments));
    // Check if Cache file exists
    if(is_file($Cache = dirname(__FILE__)."/{$Hash}.serial")){
        // Test if file expired
        if(($MTime = filemtime($Cache)) >= (time() - $Expiration)){
            // Attempt to load data, assume it's corrupted
            if(($Data = unserialize(file_get_contents($Cache))) !== false){
                return $Data;
            }
        }
    }
    // Now regenerate the data if you got here
    $Data = call_user_func_array($Callback, $Arguments);
    // Store it, with  LOCK_EX enabled to prevent collisions
    file_put_contents($Cache, serialize($Data), LOCK_EX);
    // Return the data
    return $Data;
}

// Test case (store current time for 10 seconds, keep refreshing)
var_dump($Data = CallFunctionAndCacheResult(function(){
    // Return some data to be cached
    return array_merge(func_get_args(), array(
        'cached'    => gmstrftime('%A, %d %B %Y %H:%M:%S'),
    ));
}, array(
    'Username',
    'Password',
    // ...
), 10));

それが理にかなっていることを願っています。それをテストし、理解し、DBエンジンを使用して同じ結果を達成するだけです。

于 2012-10-27T18:42:04.733 に答える
1

キャッシングはここでのあなたの友達です。不要なAPIクエリを何度も実行していると思われる場合は、情報をキャッシュする必要があります。情報が非常にマイナー/重要でない場合はCookieに、そうでない場合はデータベースにキャッシュします。

同様に、ユーザーが自分の名前を取得するためにクエリを実行するページを更新したい場合、制限を使い果たしたくありません。彼の名前を一度取得してCookieに保存し、それ以降は毎回クエリを実行する代わりに使用できます。他の答えが言うように、より速く、そして効率的です。

于 2012-10-27T19:47:26.440 に答える