2013-02-20 3 views
5

PHP의 특정 섹션을 X 초로 제한하고 싶습니다. 현재 실행중인 코드 (전체 스크립트가 아닌 섹션 만)를 죽이십시오. 대체 코드를 실행하십시오.PHP - 너무 오래 걸리는 코드를 멈추고 잡으십시오.

의사 코드 예제 (예제는 여기에 케이스를 사용 때로는 빠르고 불안정 API 및 다른 배를 블랙홀이다) :

$completed = 1; 
$seconds = 60; 
while ($completed != -1 && $completed < 5) { 
    limit ($seconds) { 
     $api = new SomeAPI('user','secret','key'); 
     $data = $api->getStuff('user="bob"'); 
     $completed = -1; 
    } catch() { 
     $completed++; 
     sleep(10); 
    } 
} 
if ($completed === 5) echo "Error: API black-hole'd 5 times.\n"; 
else { 
    //Notice: data processing is OUTSIDE of the time limit 
    foreach ($data as $row) { 
      echo $row['name'].': '.$row['message']."\n"; 
    } 
} 

그러나,이 아무것도을 위해 일해야한다는. API/HTTP 요청 뿐만이 아닙니다. 예 : 집중적 인 데이터베이스 절차 경우

당신은 너무 빨리 읽는 : 나는 어떻게 그에 틀렸다하지 않는 한 그들이합니다 (전체 스크립트에 대한 시간 제한보다는 섹션에 영향을 미치지으로set_time_limitmax_execution_time하지 답이다 물론,).

+0

API가 cURL을 사용하는 경우 [timeout 매개 변수] (http://stackoverflow.com/questions/2582057/setting-curls-timeout-in-php)를 참조하십시오. – moonwave99

+0

'max_execution_time'이 이미 ∞로 설정되어 있다고 가정합니다. –

+0

어쩌면 시도 할 무언가 (컬을 사용하지 않는 경우)는 gearman과 같은 비동기 처리 시스템을 사용하게됩니다. 따라서 처리 중에도 중단 될 수 있습니다. http://stackoverflow.com/questions/2270323/멈추는 기어 맨 - 정중하게 – ChrisK

답변

3

API 호출의 경우 API 호출에 대해 특정 시간 초과를 설정할 수있는 cURL을 사용하는 것이 좋습니다.

일반적인 용도로, 각 프로세스의 시간을 지정하고 예상 시간을 초과하는 경우 프로세스를 종료 할 수있는 프로세스를 포킹 할 수 있습니다.

물론 반복적 인 루프 구조로 인해 코드 섹션이 실행 시간이 오래 걸리는 경우 지정된 시간 간격 후에 루프에서 벗어날 수있는 자체 타이머를 제공 할 수 있습니다.

질문에 직접 답변하지는 못했지만 코드 블록이 실제로 무엇을하는지에 따라 다른 접근 방식을 사용해야 할 수도 있습니다.

관련 문제