>  기사  >  백엔드 개발  >  PHP 크롤러를 위한 동시성 및 멀티스레딩 기술

PHP 크롤러를 위한 동시성 및 멀티스레딩 기술

PHPz
PHPz원래의
2023-08-08 14:31:451133검색

PHP 크롤러를 위한 동시성 및 멀티스레딩 기술

PHP 크롤러의 동시성 및 멀티스레드 처리 기술

소개:
인터넷의 급속한 발전으로 인해 많은 양의 데이터 정보가 다양한 웹 사이트에 저장되고 있으며 이 데이터를 얻는 것이 많은 비즈니스에서 필수 사항이 되었습니다. 시나리오. 크롤러는 네트워크 정보를 자동으로 얻기 위한 도구로서 데이터 수집, 검색 엔진, 여론 분석 및 기타 분야에서 널리 사용됩니다. 이 기사에서는 PHP 기반 크롤러 클래스에 대한 동시성 및 멀티스레딩 처리 기술을 소개하고 코드 예제를 통해 그 구현을 보여줍니다.

1. 파충류 클래스의 기본 구조
파충류 클래스의 동시성 및 멀티스레드 처리를 구현하기 전에 먼저 기본 파충류 클래스의 구조를 살펴보겠습니다.

class Crawler {
    private $startUrl;

    public function __construct($startUrl) {
        $this->startUrl = $startUrl;
    }

    public function crawl() {
        // 获取初始页面的内容
        $content = $this->getContent($this->startUrl);

        // 解析页面内容,获取需要的信息
        $data = $this->parseContent($content);

        // 处理获取到的信息,进行业务逻辑处理或存储
        $this->processData($data);

        // 获取页面中的链接,并递归抓取
        $urls = $this->getUrls($content);
        foreach ($urls as $url) {
            $content = $this->getContent($url);
            $data = $this->parseContent($content);
            $this->processData($data);
        }
    }

    private function getContent($url) {
        // 发起HTTP请求,获取页面内容
        // ...
        return $content;
    }

    private function parseContent($content) {
        // 解析页面内容,提取需要的信息
        // ...
        return $data;
    }

    private function processData($data) {
        // 处理获取到的信息,进行逻辑处理或存储
        // ...
    }

    private function getUrls($content) {
        // 获取页面中的链接
        // ...
        return $urls;
    }
}

위 코드에서는 먼저 Crawler 클래스를 정의하고 생성자를 통해 시작 URL을 전달합니다. 크롤링() 메서드에서는 먼저 시작 페이지의 콘텐츠를 얻은 다음 페이지 콘텐츠를 구문 분석하고 필요한 정보를 추출합니다. 그 후, 획득한 정보를 데이터베이스에 저장하는 등 처리할 수 있습니다. 마지막으로 페이지의 링크를 가져오고 다른 페이지를 재귀적으로 크롤링합니다.

2. 동시 처리
일반적으로 크롤러는 많은 수의 URL을 처리해야 하며 네트워크 요청의 IO 작업에는 시간이 많이 걸립니다. 순차 실행을 사용하는 경우 하나의 요청이 완료된 후 다음 요청을 요청하면 크롤링 효율성이 크게 저하됩니다. 동시 처리 기능을 향상시키기 위해 PHP의 다중 프로세스 확장을 사용하여 이를 달성할 수 있습니다.

class ConcurrentCrawler {
    private $urls;

    public function __construct($urls) {
        $this->urls = $urls;
    }

    public function crawl() {
        $workers = [];
        $urlsNum = count($this->urls);
        $maxWorkersNum = 10; // 最大进程数

        for ($i = 0; $i < $maxWorkersNum; $i++) {
            $pid = pcntl_fork();
            if ($pid == -1) {
                die('fork failed');
            } else if ($pid == 0) {
                for ($j = $i; $j < $urlsNum; $j += $maxWorkersNum) {
                    $this->processUrl($this->urls[$j]);
                }
                exit();
            } else {
                $workers[$pid] = true;
            }
        }

        while (count($workers)) {
            $pid = pcntl_wait($status, WUNTRACED);
            if ($status == 0) {
                unset($workers[$pid]);
            } else {
                $workers[$pid] = false;
            } 
        }
    }

    private function processUrl($url) {
        // 发起HTTP请求,获取页面内容
        // ...
        // 解析页面内容,获取需要的信息
        // ...
        // 处理获取到的信息,进行逻辑处理或存储
        // ...
    }
}

위 코드에서는 먼저 ConcurrentCrawler 클래스를 정의하고 생성자를 통해 크롤링해야 하는 URL 집합을 전달합니다. 크롤링() 메소드에서는 동시 처리를 위해 다중 프로세스 방식을 사용합니다. pcntl_fork() 함수를 사용하면 URL의 일부가 각 하위 프로세스에서 처리되고 상위 프로세스는 하위 프로세스를 관리합니다. 마지막으로 pcntl_wait() 함수를 통해 모든 하위 프로세스가 끝날 때까지 기다립니다.

3. 멀티스레드 처리
동시 처리를 위해 여러 프로세스를 사용하는 것 외에도 PHP의 스레드 확장을 사용하여 멀티스레드 처리를 구현할 수도 있습니다.

class MultithreadCrawler extends Thread {
    private $url;

    public function __construct($url) {
        $this->url = $url;
    }

    public function run() {
        // 发起HTTP请求,获取页面内容
        // ...
        // 解析页面内容,获取需要的信息
        // ...
        // 处理获取到的信息,进行逻辑处理或存储
        // ...
    }
}

class Executor {
    private $urls;

    public function __construct($urls) {
        $this->urls = $urls;
    }

    public function execute() {
        $threads = [];
        foreach ($this->urls as $url) {
            $thread = new MultithreadCrawler($url);
            $thread->start();
            $threads[] = $thread;
        }

        foreach ($threads as $thread) {
            $thread->join();
        }
    }
}

위 코드에서는 먼저 Thread 클래스에서 상속되는 MultithreadCrawler 클래스를 정의하고 run() 메서드를 스레드의 기본 논리로 다시 작성합니다. Executor 클래스에서는 루프를 통해 여러 스레드를 생성하고 실행을 위해 시작합니다. 마지막으로 Join() 메소드를 통해 모든 스레드가 끝날 때까지 기다립니다.

결론:
PHP 크롤러의 동시성 및 멀티스레드 처리 기술 도입을 통해 동시성 처리와 멀티스레드 처리 모두 크롤러의 크롤링 효율성을 크게 향상시킬 수 있음을 알 수 있습니다. 그러나 실제 개발 과정에서는 구체적인 상황에 따라 적절한 처리 방법을 선택해야 합니다. 동시에 다중 스레드 또는 다중 프로세스의 안전을 보장하기 위해 처리 중에 적절한 동기화 작업도 수행해야 합니다.

위 내용은 PHP 크롤러를 위한 동시성 및 멀티스레딩 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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