PHP 매뉴얼에 명확하지 않은 컬_멀티(curl_multi) 계열 함수에 대해 많은 사람들이 고민하고 있다고 생각합니다. 문서도 적고 예제도 너무 간단해서 배울 수 없을 정도지만, 웹페이지도 많이 검색해 봤습니다. 완전한 응용 프로그램을 찾지 못했습니다.
curl_multi_add_handle
curl_multi_close
curl_multi_getcontent
curl_multi_info_read
cur l_ multi_init
curl_multi_remove_handle
curl_multi_select
일반적으로 말해서, 이러한 기능을 사용하려면 하나씩 요청하는 것이 아니라 동시에 여러 URL을 요청하는 것이 목적이어야 합니다. 그렇지 않으면 컬을 조정하는 루프만큼 좋지 않습니다.
단계는 다음과 같이 요약됩니다.
1단계:curl_multi_init 호출
2단계: 루프에서curl_multi_add_handle 호출
이 단계에서는 컬_멀티_추가_핸들(curl_multi_add_handle)은 컬_init의 하위 핸들에 의해 제공됩니다.
3단계: 계속해서 cur_multi_exec 호출
4단계: 루프에서 cur_multi_getcontent를 호출하여 필요에 따라 결과 얻기
5단계: cur_multi_remove_handle을 호출하고 각 단어 핸들에 대해 cur_close를 호출
6단계: 호출 cur_multi_close
여기에 온라인에서 발견된 간단한 예가 있습니다. 저자는 이를 더러운 예라고 부릅니다. (왜 더러운지는 나중에 설명하겠습니다.)
/* Here's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1 */ $connomains = array( "http://www.cnn.com/", "http://www.canada.com/", "http://www.yahoo.com/" ); $mh = curl_multi_init(); foreach ($connomains as $i => $url) { $conn[$i]=curl_init($url); curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1); curl_multi_add_handle ($mh,$conn[$i]); } do { $n=curl_multi_exec($mh,$active); } while ($active); foreach ($connomains as $i => $url) { $res[$i]=curl_multi_getcontent($conn[$i]); curl_close($conn[$i]); } print_r($res);
전체 사용 과정은 거의 다음과 같습니다. 단순 코드에는 치명적인 약점이 있습니다. 즉, do 루프의 일부가 전체 URL 요청 중에 무한 루프가 되어 CPU가 쉽게 100%를 차지할 수 있다는 것입니다.
이제 개선해 보겠습니다. 문서가 거의 없는 cur_multi_select 함수를 사용해야 합니다. C의 컬 라이브러리에는 선택에 대한 지침이 있지만 PHP의 인터페이스와 사용법은 실제로 C의 그것과 다릅니다.
위의 do 섹션을 다음과 같이 변경합니다:
do { $mrc = curl_multi_exec($mh,$active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } }
$active는 모든 URL 데이터가 수신될 때까지 기다려야 false가 되기 때문에 여기서는 cur_multi_exec의 반환 값을 사용하여 결정합니다. 아직 유효한지 여부. 데이터가 있는 경우 계속해서 컬_멀티_exec를 호출하고, 당분간 데이터가 없으면 선택 단계로 진입하여 실행을 계속할 수 있습니다. . 여기서 장점은 불필요한 CPU 소모가 없다는 점입니다.
추가로: 때때로 접할 수 있는 몇 가지 세부 사항이 있습니다:
각 요청의 시간 초과를 제어합니다. 컬_multi_add_handle 전에 컬_setopt를 통해 수행합니다.
curl_setopt($ch , CURLOPT_TIMEOUT, $ timeout);
시간 초과 또는 기타 오류가 발생했는지 확인하려면 다음을 사용하세요. curl_error($conn[$i])
curl_multi_getcontent 전에class MultiCurl{ private $mch; private $timeout; private $urls; private $chs; private $errchs; private $content; public function __construct($urls, $timeout=300){ $this->mch = curl_multi_init(); $this->timeout = $timeout; $this->urls = $urls; $this->chs = array(); $this->errchs = array(); $this->content = array(); } public function ctlFlow(){ $this->createhandle(); $this->execurl(); $this->chs = array(); $this->errchs = array(); echo "<pre class="brush:php;toolbar:false">"; print_r($this->content); echo ""; return $this->content; } private function createhandle(){ if(!empty($this->urls)){ foreach($this->urls as $k => $url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout); curl_multi_add_handle($this->mch, $ch); $this->chs[$k] = $ch; } } } private function execurl(){ do { $mrc = curl_multi_exec($this->mch,$active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($this->mch) != -1) { usleep(300); do { $mrc = curl_multi_exec($this->mch, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach($this->chs as $k => $c){ if (curl_error($c) == '') { $temp = curl_multi_getcontent($c); $count = 0; while(!$temp){ if($count > 3) break; usleep(100); $temp = curl_multi_getcontent($c); $count++; } $this->content[$k] = $temp; unset($this->chs[$k]); curl_multi_remove_handle($this->mch, $c); curl_close($c); } else { $this->errchs[$k] = $this->urls[$k]; } } } } $urlArr = array('baidu'=>'www.baidu.com', 'google'=>'www.google.com.hk', 'sogou'=>'www.sogou.com'); $mucurl = new MultiCurl($urlArr); $mucurl->ctlFlow();
위 내용은 PHP에서 컬_멀티(curl_multi) 관련 함수 적용에 대한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!