ホームページ >PHPフレームワーク >Swoole >Swoole Advanced: Web クローラー開発にコルーチンを使用する

Swoole Advanced: Web クローラー開発にコルーチンを使用する

WBOY
WBOYオリジナル
2023-06-13 13:29:071613ブラウズ

インターネット テクノロジーの継続的な発展に伴い、Web クローラーは今日のインターネット アプリケーションに不可欠な部分となり、データ収集、ビジネス発見、世論監視などの幅広いアプリケーション シナリオを備えています。ただし、従来の Web クローラーは通常、マルチスレッドまたはマルチプロセスを使用して同時リクエストを実装しており、コンテキスト切り替えのオーバーヘッドや過剰なメモリ使用量などの問題に直面しています。近年、Swoole は PHP アプリケーションの新たなスターとなり、そのコルーチン機能により、Web クローラーの同時リクエストに対する効率的なソリューションを提供できます。

この記事では、Swoole コルーチンを使用して軽量で効率的な Web クローラーを実装する方法を紹介します。

Swoole の概要

Swoole は、PHP 言語をベースとした高性能ネットワーク通信フレームワークであり、その最大の特徴はコルーチンをサポートしていることです。コルーチンはユーザー モードの軽量スレッドであり、従来のスレッドやプロセスと比較して、コンテキスト切り替えのオーバーヘッドとメモリ使用量が少なく、CPU のパフォーマンスをより有効に活用できます。

Swoole を使用した Web クローラーの実装

Swoole のコルーチン機能は、Web クローラーの開発に非常に優れたプラットフォームを提供します。従来の Web クローラーは、同時リクエストを行うときに大量のシステム リソースを消費することがよくありましたが、Swoole コルーチンを使用すると、従来のスレッド切り替えによるオーバーヘッドを回避しながら、高い同時リクエストを簡単に実現できます。

以下は、Swoole を使用して実装された Web クローラーの簡単な例です:

<?php
// 1. 创建Swoole HTTP服务器
$http = new SwooleHttpServer("0.0.0.0", 9501);

// 2. 处理请求
$http->on('request', function ($request, $response) {
    // 3. 发送HTTP请求
    $cli = new SwooleCoroutineHttpClient('www.baidu.com', 80);
    $cli->setHeaders([
        'Host' => "www.baidu.com",
        "User-Agent" => 'Chrome/49.0.2587.3',
        'Accept' => 'text/html,application/xhtml+xml,application/xml',
        'Accept-Encoding' => 'gzip',
    ]);
    $cli->get('/');

    // 4. 响应HTML内容
    $response->header("Content-Type", "text/html; charset=utf-8");
    $response->end($cli->body);
});

// 5. 启动HTTP服务器
$http->start();

上記のコード例は、Swoole HTTP サーバーを作成し、ポート番号 9501 をリッスンします。 HTTP リクエストが到着すると、サーバーは HTTP リクエストを Baidu Web サイトに送信し、HTML コンテンツで応答します。

Swoole コルーチン HTTP クライアント

Swoole は、コルーチン ベースの HTTP クライアントを提供します。コルーチンを介して、複数の HTTP リクエストを 1 つのプロセスで同時に開始でき、リクエストは、複数のスレッドまたはプロセスを開始する必要があります。

コルーチン HTTP クライアントの使用は非常に簡単です。使用例を次に示します:

<?php
// 1. 创建协程HTTP客户端
$cli = new SwooleCoroutineHttpClient('www.baidu.com', 80);

// 2. 配置请求头
$cli->setHeaders([
    'Host' => "www.baidu.com",
    "User-Agent" => 'Chrome/49.0.2587.3',
    'Accept' => 'text/html,application/xhtml+xml,application/xml',
    'Accept-Encoding' => 'gzip',
]);

// 3. 发送HTTP请求
$cli->get('/');

// 4. 输出响应内容
echo $cli->body;

上記のコード例では、コルーチン HTTP クライアントを作成し、リクエスト ヘッダーを設定し、HTTP リクエストを送信し、 Responseの内容を出力します。

コルーチンを使用してクローラーを実装する

Swoole コルーチン HTTP クライアントを使用すると、高性能 Web クローラーを簡単に実装できます。以下は、コルーチンを使用して実装されたクローラーの例です。

<?php
// 1. 抓取百度搜索结果的页面
$html = file_get_contents('https://www.baidu.com/s?ie=UTF-8&wd=swoole');

// 2. 解析HTML,提取搜索结果列表的URL
preg_match_all('/<a.*?href="(.*?)".*?>/is', $html, $matches);
$urls = $matches[1];

// 3. 并发请求搜索结果列表的URL
$cli = new SwooleCoroutineHttpClient('www.baidu.com', 80);
foreach ($urls as $url) {
    $cli->setHeaders([
        'Host' => "www.baidu.com",
        "User-Agent" => 'Chrome/49.0.2587.3',
        'Accept' => 'text/html,application/xhtml+xml,application/xml',
        'Accept-Encoding' => 'gzip',
    ]);
    $cli->get($url);
    echo $cli->body;
}

// 4. 关闭HTTP客户端
$cli->close();

上記のコード例は、まず、Baidu が「swoole」キーワードを検索するページをクロールし、HTML を解析し、検索結果リストの URL を抽出します。これらの URL を同時にリクエストします。

概要

Swoole は高性能ネットワーク通信フレームワークであり、そのコルーチン機能は Web クローラーの開発に効率的なソリューションを提供します。 Swoole コルーチン HTTP クライアントを使用すると、Web クローラーの同時リクエスト機能を大幅に向上させながら、マルチスレッドまたはマルチプロセスによって発生するリソースの消費とコンテキスト切り替えのオーバーヘッドを回避できます。

以上がSwoole Advanced: Web クローラー開発にコルーチンを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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