2017-12-28 20 views
0

私は使用しているAPIにレート制限を適用していますが、これを防ぐために使用した方法が間違いなく機能するはずなので、混乱しています。時間の100%は働かない。私は私の限界に近づいているかどうかを確認する関数を呼び出すはずのすべてのAPI呼び出しの前にこの行を持っています。このように:ここで sleep()を使用して速度制限が動作しないようにする

if (isset($http_response_header)) {rateLimit($http_response_header);} 
file_get_contents($endpointURL); 

は機能だ:私が毎秒コールの最大数を作った場合は1秒に寝て、私が作った場合は2分をスリープ状態になっています

function rateLimit($header) 
{ 
// get hit count from $header 

// $count[0] is how many hits per second 
// I have a limit of 20 per second 

// $count[1] is how many hits per 2 minutes 
// I have a limit of 100 per 2 minutes 

if ($count[0] == 19) {sleep(1); return;} 
if ($count[1] == 99) {sleep(120); return;} 
} 

2分あたりの最大通話数。私のコードに何か問題がありますか、あるいは間違ってAPIを使って私を制限していなければなりませんか?ここで

誰かが、私はそれを解析した方法を知りたいと思っているので、全体rateLimit関数である。

function rateLimit($header) 
{ 
$pos1 = strpos($header[7], ' ') + 1; 
$pos2 = strpos($header[7], ':', $pos1); 
$count[0] = substr($header[7], $pos1, ($pos2 - $pos1)); 

$pos1 = strpos($header[7], ',') + 1; 
$pos2 = strpos($header[7], ':', $pos1); 
$count[1] = substr($header[7], $pos1, ($pos2 - $pos1)); 

if ($count[0] == 18) {sleep(1); return;} 
if ($count[1] == 98) {sleep(120); return;} 
} 
+0

RTM:[http_response_header](http://php.net/manual/en/reserved.variables.httpresponseheader.php)はintの配列を返しません。あなたの解析方法を示してください。また、スリープするのは良い考えではなく、代わりにfalseを返し、rateLimit関数を条件のチェックとして使用します。 –

+0

あなたは頻繁にAPIをヒットする必要がありますか?最大20ヒット/秒の音が酷いです。それはちょうど私に "キャッシング"を叫びますが、あなたはいくつかのライブアップデートをしています。 – JimL

+0

@Lawrence Cherone私はどのように解析したかを示す関数全体を使って質問を更新しました。どれくらい時間がかかっても、私は仕事を呼び出す必要があるので、私は睡眠を使ってスキップする代わりにAPI呼び出しを延期しています。あなたの名前の前に@をタイプすると、それはなぜ機能しませんか?私はRiot Games(League of Legends)APIの開発キーを使用していますが、これはテスト目的にすぎないため厳しく制限されています。彼らは一週間ほどの間、より良い鍵のアプリケーションを受け入れませんが、私はそれまでに持っていたものと一緒に働いています。 –

答えて

0

あなたは$countがあなたのrateLimit関数内で配列として定義されていないので、あなたはおそらく、未定義になっていますインデックスの警告とそれはあなたのコードを壊している。

だからいずれかを実行し、この

function rateLimit($header) 
{ 
    $count = [];  

    $pos1 = strpos($header[7], ' ') + 1; 
    $pos2 = strpos($header[7], ':', $pos1); 
    $count[0] = substr($header[7], $pos1, ($pos2 - $pos1)); 

    $pos1 = strpos($header[7], ',') + 1; 
    $pos2 = strpos($header[7], ':', $pos1); 
    $count[1] = substr($header[7], $pos1, ($pos2 - $pos1)); 

    if ($count[0] == 18) {sleep(1); return;} 
    if ($count[1] == 98) {sleep(120); return;} 
} 

またはこの

function rateLimit($header) 
{ 
    $pos1 = strpos($header[7], ' ') + 1; 
    $pos2 = strpos($header[7], ':', $pos1); 

    $pos1 = strpos($header[7], ',') + 1; 
    $pos2 = strpos($header[7], ':', $pos1); 

    if (substr($header[7], $pos1, ($pos2 - $pos1)) == 18) {sleep(1); return;} 
    if (substr($header[7], $pos1, ($pos2 - $pos1)) == 98) {sleep(120); return;} 
} 
+0

残念なことに、これらの解決法はどちらもうまくいきませんでした(問題は、テストヘッダーを使用しているため、配列の宣言がうまくいかなかったことを確認できます)。ロジックが単純で、 '$ header [7]'の値が異なっている可能性があるので、私の 'rateLimit'関数は動作するはずです。 '$ header [7]'は 'X-App-Rate-Limit-Count:x:1、y:120'のようになります。ここで、xとyはそれぞれ1秒間と2分間のヒット数です。たぶん、APIが誤って私を制限しているのかもしれません。 –

+0

いいえ、限界に達したときにのみAPIが私を制限していることが判明しました。それが起こる前に私のコードが私に 'sleep 'をさせない理由を確かめてください。 –

+0

私は 'if($ count [0] == 19){sleep(1); return;} '$ count [1] == 99'ならばスリープ状態になります。なぜこれが起きているのか解明して、報告してください。 –

0

問題は、私はいつも私に私のヒット数を伝える文字列をキー7で見ていたことが判明したが、それはで時々でした別のキー。

関連する問題