웹 크롤러 구현에서 비동기 멀티스레딩은 크롤링 효율성을 크게 향상시킬 수 있습니다. 주류 프로그래밍 언어인 PHP는 동시 프로그래밍을 통해 비동기 다중 스레드 크롤러를 구현할 수도 있습니다. 이 기사에서는 구체적인 구현 방법을 소개합니다.
1. 비동기 멀티스레드 크롤러 개요
비동기 멀티스레드 크롤러는 주로 비동기식 IO와 멀티스레드 처리라는 두 가지 기술을 사용합니다. 기존 동기 IO에서 스레드는 다음 단계로 진행하기 전에 IO 작업이 완료될 때까지 기다립니다. 비동기 IO에서는 스레드가 IO 작업을 기다리는 동안 다른 작업을 수행할 수 있으므로 프로그램 실행 효율성이 향상됩니다. 멀티스레딩은 동시에 여러 작업을 수행하여 작업 처리 속도를 높일 수 있습니다.
2. 비동기 멀티스레딩 구현 원칙
PHP에서 비동기 멀티스레딩을 구현하는 것은 주로 pthread와 cURL이라는 두 가지 확장에 의존합니다. pthread 확장은 POSIX 스레드 표준을 기반으로 하는 멀티스레드 확장으로, PHP에서 멀티스레딩 기능을 활성화할 수 있습니다. cURL은 cURL을 통해 네트워크 데이터 전송을 실현할 수 있는 PHP에서 사용되는 네트워크 라이브러리입니다.
비동기 멀티스레드 크롤러를 구현하는 주요 과정은 다음과 같습니다.
3. 구현 단계
Linux에서는 다음 명령을 사용하여 pthread 확장을 설치할 수 있습니다.
sudo pecl install pthreads
Windows에서는 pthread 확장 DLL을 얻을 수 있습니다. PHP 공식 웹사이트에서 파일을 설치하세요.
메인 스레드와 하위 스레드 생성은 PHP의 Thread 클래스를 통해 수행할 수 있습니다.
class SpiderThread 확장 스레드 {
private $url; public function __construct($url) { $this->url = $url; } public function run() { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); $this->synchronized(function($thread){ $thread->notify(); }, $this); return $result; }
}
메인 스레드는 pthreads에 의해 확장된 Mutex 클래스를 통해 동기화될 수 있습니다.
$mutex = new Mutex();
$threads = array();
foreach($urls as $url) {
$mutex->lock(); $threads[] = new SpiderThread($url); end($threads)->start(); $mutex->unlock(); $mutex->synchronized(function($mutex){ $mutex->wait(); }, $mutex);
}
foreach($threads as $thread) {
$result = $thread->join(); //处理爬取结果
}
위 코드에서 $urls는 크롤링할 링크를 저장하는 배열입니다. 메인 스레드는 배열을 순회하며 작업 처리를 위한 하위 스레드를 생성합니다. 하위 스레드에서 반환된 결과는 $result에 저장됩니다.
프로그램 실행 효율성을 향상시키기 위해 스레드 풀 기술을 사용하여 하위 스레드의 생성 및 소멸을 관리할 수 있습니다. 특정 개수의 하위 스레드가 스레드 풀에 유지됩니다. 기본 스레드가 스레드 풀에 작업을 제출하면 스레드 풀은 스레드의 실시간 상태를 기반으로 작업 처리를 위해 유휴 스레드 중 하나를 선택합니다.
다음은 간단한 스레드 풀 구현 예입니다.
class ThreadPool {
private $pool; private $tasks; public function __construct($size) { $this->pool = new SplQueue(); for($i = 0; $i < $size; $i++) { $this->pool->enqueue(new SpiderThread()); } $this->tasks = new SplQueue(); } public function execute($task) { if($this->pool->isEmpty()) { $this->tasks->enqueue($task); } else { $thread = $this->pool->dequeue(); $thread->execute($task); } } public function addThread($thread) { $this->pool->enqueue($thread); } public function addTask($task) { $this->tasks->enqueue($task); $this->checkTask(); } public function checkTask() { if(!$this->tasks->isEmpty() && !$this->pool->isEmpty()) { $thread = $this->pool->dequeue(); $task = $this->tasks->dequeue(); $thread->execute($task); } }
}
IV 요약
이 문서에서는 다음을 통해 PHP에서 비동기 멀티 스레드 크롤러를 구현하는 기본 방법을 소개합니다. pthread 및 cURL은 멀티스레딩 및 네트워크 데이터 전송을 구현하여 크롤러의 운영 효율성을 크게 향상시킬 수 있습니다. 실제 응용에서는 스레드 풀 기술을 사용하여 프로그램 실행 효율성을 더욱 향상시킬 수 있습니다.
위 내용은 PHP로 비동기 멀티스레드 크롤러를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!