>  기사  >  백엔드 개발  >  PHP 멀티스레딩 내부 멀티스레딩 인스턴스 분석_php 기술

PHP 멀티스레딩 내부 멀티스레딩 인스턴스 분석_php 기술

WBOY
WBOY원래의
2016-05-16 20:21:431056검색

이 기사에서는 PHP 멀티스레딩의 내부 멀티스레딩 사용법을 예제와 함께 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 내용은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
클래스 Http_MultiRequest
{
//병렬 크롤링할 URL 목록
비공개 $urls = array();
//컬 옵션
비공개 $옵션;
//생성자
함수 __construct($options = array())
{
           $this->setOptions($options);
}
//URL 목록 설정
함수 setUrls($urls)
{
           $this->urls = $urls;
         $this를 반환하세요.
}
//옵션 설정
함수 setOptions($options)
{
         $options[CURLOPT_RETURNTRANSFER] = 1;
If (isset($options['HTTP_POST']))
           {
               컬_setopt($ch, CURLOPT_POST, 1);
              컬_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']);
              unset($options['HTTP_POST']);
}
If (!isset($options[CURLOPT_USERAGENT]))
           {
$options[CURLOPT_USERAGENT] = 'Mozilla/4.0(호환; MSIE 6.0; Windows NT 5.1; SV1;)';
}
If (!isset($options[CURLOPT_FOLLOWLOCATION]))
           {
               $options[CURLOPT_FOLLOWLOCATION] = 1;
}
If (!isset($options[CURLOPT_HEADER]))
           {
               $options[CURLOPT_HEADER] = 0;
}
            $this->options = $options;
}
//모든 콘텐츠를 병렬로 가져옵니다
함수 exec()
{
If(empty($this->urls) || !is_array($this->urls))
           {
              false를 반환합니다.
}
​​​​ $curl = $data = array();
          $mh = cur_multi_init();
foreach($this->urls $k => $v)
           {
$curl[$k] = $this->addHandle($mh, $v);
}
           $this->execMulitHandle($mh);
foreach($this->urls $k => $v)
           {
                $data[$k] =curl_multi_getcontent($curl[$k]);
              curl_multi_remove_handle($mh, $curl[$k]);
}
        curl_multi_close($mh);
         $data 반환
}
//한 웹페이지의 콘텐츠만 가져옵니다.
함수 execOne($url)
{
            if (비어 있음($url)) {
              false를 반환합니다.
}
           $ch = 컬_init($url);
           $this->setOneOption($ch);
          $content = 컬_exec($ch);
         컬_닫기($ch);
         $content 반환
}
//내부함수, 특정 핸들의 옵션 설정
비공개 함수 setOneOption($ch)
{
컬_setopt_array($ch, $this->옵션);
}
//새 병렬 크롤링 핸들 추가
비공개 함수 addHandle($mh, $url)
{
           $ch = 컬_init($url);
           $this->setOneOption($ch);
        curl_multi_add_handle($mh, $ch);
         $ch 반환;
}
//병렬실행 (이런 방법은 흔히 범하는 실수인데 여기서는 아직도 이런 방법, 이런 방법을 쓰고 있습니다
//작은 파일을 다운로드하면 컵이 100%를 차지할 수 있으며 이 주기는 100,000회 이상 실행됩니다
//원리를 이해하지 못해 발생하는 대표적인 오류입니다. 이 오류는 PHP 공식 문서에서 매우 일반적입니다. )
개인 함수 execMulitHandle($mh)
{
         $running = null;
하세요 {
              curl_multi_exec($mh, $running);
           } while ($running > 0);
}
}
/*다음은 위 클래스에 대한 테스트 예시입니다:*/
$urls = array("http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http:// baidu.com", "http://baidu.com", "http://www.google.com", "http://www.sina.com.cn", );
$m = 새로운 Http_MultiRequest();
$t = 마이크로타임(true);
$m->setUrls($urls);
//병렬 가져오기(병렬 가져오기):
$data = $m->exec();
$parallel_time = 마이크로타임(true) - $t;
에코 $parallel_time ."n";
$t = 마이크로타임(true);
//직렬 가져오기(직렬 가져오기):
foreach($url을 $url로)
{
$data[] = $m->execOne($url);
}
$serial_time = 마이크로타임(true) - $t;
에코 $serial_time .

이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.

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