ホームページ  >  記事  >  バックエンド開発  >  PHP クローラーの同時実行およびマルチスレッド技術

PHP クローラーの同時実行およびマルチスレッド技術

PHPz
PHPzオリジナル
2023-08-08 14:31:451193ブラウズ

PHP クローラーの同時実行およびマルチスレッド技術

PHP クローラーの同時実行性とマルチスレッド処理スキル

はじめに:
インターネットの急速な発展に伴い、大量のデータ情報がさまざまな Web サイトでこのデータを取得することは、多くのビジネス シナリオで要件となっています。クローラーは、ネットワーク情報を自動的に取得するツールとして、データ収集、検索エンジン、世論分析などの分野で広く利用されています。この記事では、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 を渡します。 roll() メソッドでは、最初に開始ページのコンテンツを取得し、次にページのコンテンツを解析して必要な情報を抽出します。その後、取得した情報をデータベースに保存するなどの処理を行うことができます。最後に、ページ内のリンクを取得し、他のページを再帰的にクロールします。

2. 同時処理
通常、クローラーは多数の URL を処理する必要があり、ネットワーク リクエストの IO 操作には非常に時間がかかります。順次実行を使用する場合、1 つのリクエストが完了した後に次のリクエストをリクエストすると、クロール効率が大幅に低下します。同時処理能力を向上させるために、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 のセットを渡します。また、crawl()メソッドでは、同時処理を行うマルチプロセス方式を採用しています。 pcntl_fork() 関数を使用すると、URL の一部が各子プロセスで処理され、親プロセスは子プロセスの管理を担当します。最後に、pcntl_wait() 関数を通じてすべての子プロセスが終了するのを待ちます。

3. マルチスレッド処理
複数のプロセスを使用して同時処理を行うだけでなく、PHP の Thread 拡張機能を使用してマルチスレッド処理を実装することもできます。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。