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

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

Aug 08, 2023 pm 02:31 PM
同時処理 PHPクローラー マルチスレッドのヒント

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 Jul 08, 2023 pm 09:13 PM

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 最近、PHPは最新バージョンのPHP8.1を正式にリリースし、重要な機能である複数リクエストの同時処理のためのcurlを導入しました。この新機能により、開発者は複数の HTTP リクエストをより効率的かつ柔軟に処理できるようになり、パフォーマンスとユーザー エクスペリエンスが大幅に向上します。以前のバージョンでは、複数のリクエストを処理するには、多くの場合、複数の CURL リソースを作成し、ループを使用してデータをそれぞれ送受信する必要がありました。この方法でも目的は達成できますが、

PHP クローラーを使用してビッグデータをクロールする方法 PHP クローラーを使用してビッグデータをクロールする方法 Jun 14, 2023 pm 12:52 PM

データ時代の到来とデータ量とデータの種類の多様化に伴い、ますます多くの企業や個人が大量のデータを取得して処理する必要があります。このとき、クローラ技術は非常に有効な手段となります。この記事では、PHP クローラーを使用してビッグデータをクロールする方法を紹介します。 1. クローラーの概要 クローラーとは、インターネットの情報を自動的に取得する技術です。原理は、プログラムを作成することによってインターネット上の Web サイトのコンテンツを自動的に取得および解析し、処理または保存に必要なデータをキャプチャすることです。クローラー プログラムの進化の中で、多くのプログラムが成熟しています。

Go言語Webサイトのアクセス速度のボトルネックを解決するローカル最適化手法 Go言語Webサイトのアクセス速度のボトルネックを解決するローカル最適化手法 Aug 07, 2023 am 10:07 AM

Go 言語 Web サイトのアクセス速度のボトルネックを解決するためのローカル最適化のヒント 要約: Go 言語は、高性能ネットワーク アプリケーションの構築に適した高速で効率的なプログラミング言語です。ただし、Go 言語で Web サイトを開発すると、アクセス速度のボトルネックが発生する場合があります。この記事では、このような問題を解決するためのいくつかのローカル最適化手法をコード例とともに紹介します。接続プーリングの使用 Go 言語では、データベースまたはサードパーティ サービスへの各リクエストに新しい接続が必要です。接続の作成と破棄によって生じるオーバーヘッドを減らすために、次のことができます。

golang フレームワークは同時実行性と非同期プログラミングをどのように処理しますか? golang フレームワークは同時実行性と非同期プログラミングをどのように処理しますか? Jun 02, 2024 pm 07:49 PM

Go フレームワークは Go の同時実行性と非同期機能を使用して、同時タスクと非同期タスクを効率的に処理するためのメカニズムを提供します。 1. 同時実行性は Goroutine によって実現され、複数のタスクを同時に実行できます。 2. 非同期プログラミングはチャネルを通じて実装されます。メインスレッドをブロックせずに実行可能。 3. HTTP リクエストの同時処理、データベース データの非同期取得などの実用的なシナリオに適しています。

コルーチンは、PHP マルチスレッド プログラミングと効率的な同時処理を実装します。 コルーチンは、PHP マルチスレッド プログラミングと効率的な同時処理を実装します。 Jun 30, 2023 pm 05:09 PM

PHP マルチスレッド プログラミングの実践: コルーチンを使用して同時タスク処理を実装する インターネット アプリケーションの開発に伴い、サーバーのパフォーマンスと同時処理能力に対する要件がますます高くなっています。従来のマルチスレッド プログラミングを PHP に実装するのは簡単ではないため、PHP の同時処理能力を向上させるために、コルーチンを使用してマルチスレッド プログラミングを実装してみることができます。 Coroutine は、単一のスレッドで複数のタスクの同時実行を実装できる軽量の同時処理モデルです。従来のマルチスレッドと比較して、コルーチンのスイッチングコストが低い

Go 言語での同時ファイルアップロードの問題に対処するにはどうすればよいですか? Go 言語での同時ファイルアップロードの問題に対処するにはどうすればよいですか? Oct 08, 2023 am 09:47 AM

Go 言語での同時ファイルアップロードの問題に対処するにはどうすればよいですか?インターネットの発展に伴い、日々の開発においてファイルのアップロードがますます一般的になりました。ファイルのアップロードのプロセスでは、複数のファイルの同時アップロードの処理が重要な考慮事項になります。この記事では、Go 言語を使用してファイルの同時アップロードの問題を処理する方法を紹介し、具体的なコード例を示します。 1. サーバーへのファイルのアップロード ファイルの同時アップロードを開始する前に、まずファイルをサーバーにアップロードする方法を理解する必要があります。 Go言語を使用したファイルアップロードの場合は、標準ライブラリを使用できます

高性能PHPクローラーの実装方法 高性能PHPクローラーの実装方法 Jun 13, 2023 pm 03:22 PM

インターネットの発展に伴い、Web ページの情報量はますます深くなり、多くの人が大量のデータから必要な情報を迅速に抽出する必要があります。現時点では、クローラーは重要なツールの 1 つとなっています。この記事では、PHP を使用して、ネットワークから必要な情報を迅速かつ正確に取得する高性能クローラを作成する方法を紹介します。 1. クローラーの基本原理を理解する クローラーの基本的な機能は、ブラウザーをシミュレートして Web ページにアクセスし、特定の情報を取得することです。サーバーへのリクエスト送信など、ユーザーがWebブラウザ上で実行する一連の操作をシミュレートできます。

Java プログラムが MySQL クエリの同時実行パフォーマンスを最適化する方法 Java プログラムが MySQL クエリの同時実行パフォーマンスを最適化する方法 Jun 30, 2023 am 08:07 AM

Java プログラムで MySQL 接続のクエリ パフォーマンスと同時実行パフォーマンスを最適化するにはどうすればよいですか? MySQL は一般的に使用されるリレーショナル データベースであり、Java は一般的に使用されるプログラミング言語です。開発プロセス中に、MySQL データベースと対話する必要がある状況によく遭遇します。プログラムのパフォーマンスと同時実行性を向上させるために、いくつかの最適化を行うことができます。接続プールの使用 接続プールはデータベース接続を管理するためのメカニズムであり、データベース接続を再利用し、データベース接続の頻繁な作成と破棄を回避できます。 Java では、

See all articles