2013-07-03 2 views
0

~ 50 개의 요청을 동일한 도메인의 다른 페이지로 보내고 DOM 객체를 사용하여 기사에 대한 URL을 얻고 싶습니다.젠드 프레임 워크에서 HTTP 클라이언트가 너무 느림 1.12

문제는이 요청 수가 30 초 이상 소요된다는 것입니다.

for ($i = 1; $i < 51; $i++) 
{ 
    $url = 'http://example.com/page/'.$i.'/';    

    $client = new Zend_Http_Client($url); 
    $response = $client->request(); 
    $dom = new Zend_Dom_Query($response); // without this two lines, execution is also too long 
    $results = $dom->query('li');   // 
} 

속도를 높이는 방법이 있습니까?

답변

1

그것은 디자인에 의한 generel의 문제이다 -가 아니라 코드 자체. 원격 URI에 대한 요청을 각각 50 개 이상 반복하는 for 루프를 수행하는 경우 원격 URI에서 응답 할 때까지 모든 요청이 대기하기 때문에 상황이 상당히 느려집니다. 예 : 요청이 완료 되려면 ~ 0.6 초가 걸리고 50을 곱하면 30 초가 소요됩니다.

다른 문제는 대부분의 웹 서버가 클라이언트 당 연결을 특정 금액으로 제한한다는 것입니다. 50 개의 요청을 동시에 수행 할 수 있다고해도 (현재는 아니지만), 일이 크게 가속화되지는 않습니다.

제 옵션에는 하나의 해결책이 있습니다 (깊은 변화가 없음) : exection 당 요청 당량을 변경하십시오. 예를 들어 청크를 만드십시오. (스크립트) 당 5-10 통화 만 호출하고 외부 호출 (예 : cron으로 실행)을 통해 호출합니다.

Todo : 현재 실행 상태를 저장 할 수있는 래퍼 함수를 ​​빌드합니다 ("마지막 실행시에 1 - 10을 요청 했으므로 이제는 11-20을 호출해야합니다) 파일이나 데이터베이스에 저장하십시오 및 크론하여이 기능을 트리거 (안된)

예 코드를 더 선언].

[...] 

private static $_chunks = 10; //amout of calls per run 

public function cronAction() { 

    $lastrun = //here get last run parameter saved from local file or database 

    $this->crawl($lastrun); 

} 

private function crawl($lastrun) { 

    $limit = $this->_chunks + $lastrun; 

    for ($i = $lastrun; $i < limit; $i++) 
    { 
     [...] //do stuff here 
    } 

    //here set $lastrun parameter to new value inside local file/database 

} 

[...] 
1

나는 그것을 빠르게하는 방법을 생각할 수 없다하지만 그 우려 경우 당신은 PHP에서 시간 제한을 늘릴 수 있습니다

for($i=1; $i<51; $i++) { 
    set_time_limit(30); //This restarts the timer to 30 seconds starting now 
    //Do long things here 
} 
관련 문제