이 기사에서는 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 프로그래밍 설계에 도움이 되기를 바랍니다.