2017-12-28 2 views
0

내가 사용하고있는 API에 속도 제한을 치고 있습니다.이를 방지하기 위해 사용했던 방법이 확실히 작동해야하기 때문에 혼란 스럽 습니다만, 시간의 100 % 작동하지 않습니다. 내 API를 호출하기 전에이 라인을 가지고 있습니다.이 함수는 내 한계에 가까운지를 확인하는 함수를 호출하기로되어 있고, 그렇다면 내 히트 카운트를 재설정 할 수있을 정도로 오래 잠을 자면됩니다. 이처럼 : 여기 sleep rate()을 사용하여 공격 속도 제한이 작동하지 않음

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가 잘못 제한되어 있어야합니다.

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

당신은 $countrateLimit 함수에서 배열로 정의하지 않아도 아마 당신은 정의되지 않은지고있다, 그래서 누군가가 내가 그것을 구문 분석했다 방법을 알고 싶어하기 때문에 여기

은 전체 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는 초당 히트 카운트이고 2 분당 히트 카운트입니다. 아마 API가 잘못 나를 제한하고 있습니다. –

+0

아니, 한계를 맞았을 때만 API가 나를 제한한다는 것을 알 수 있습니다. 왜 내 코드가 내게'sleep'을 일으키지 않는지 확신 할 수 없습니다. –

+0

'if ($ count [0] == 19) {sleep (1); return;}'$ count [1] == 99'이면 잠자기 상태가됩니다. 이것이 왜 있는지, 그리고 다시보고 할 것입니다. –

0

문제는 항상 나에게 내 히트 수를 알려주는 문자열 키 7에보고 된 것으로 밝혀졌다하지만 때로는이었다 다른 열쇠.

관련 문제