>백엔드 개발 >PHP 튜토리얼 >PHP에서 컬_멀티(curl_multi) 관련 함수 적용에 대한 설명

PHP에서 컬_멀티(curl_multi) 관련 함수 적용에 대한 설명

巴扎黑
巴扎黑원래의
2017-05-25 17:45:341344검색

PHP 매뉴얼에 명확하지 않은 컬_멀티(curl_multi) 계열 함수에 대해 많은 사람들이 고민하고 있다고 생각합니다. 문서도 적고 예제도 너무 간단해서 배울 수 없을 정도지만, 웹페이지도 많이 검색해 봤습니다. 완전한 응용 프로그램을 찾지 못했습니다.

curl_multi_add_handle

curl_multi_close

curl_multi_exec

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.