ホームページ > バックエンド開発 > PHPチュートリアル > Laravel で Guzzle を使用してマルチスレッド クローラーを作成する実践的な練習

Laravel で Guzzle を使用してマルチスレッド クローラーを作成する実践的な練習

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-23 13:06:08
オリジナル
1813 人が閲覧しました

説明

Guzzle ライブラリは、強力な PHP HTTP リクエスト スイートです。

この記事は、Guzzle を使用してマルチスレッド リクエストを開始する方法を示すことに重点を置いています。

リファレンス

    Github公式ユーザーインターフェースドキュメント
  • Guzzle同時リクエストドキュメント
  • Laravel LTS 5.1 - Artisanドキュメント
コマンドの作成

1. コマンドラインcreateコマンドを実行します

rreeを登録します。コマンド

編集app /Console/Kernel.php に次を追加します:

php artisan make:console MultithreadingRequest --command=test:multithreading-request
ログイン後にコピー

3. コマンドをテストします

app/Console/Commands/MultithreadingRequest.php ファイルを変更し、次を追加します:

Commands\MultithreadingRequest::class,
ログイン後にコピー

出力:

$this->info('hello');
ログイン後にコピー

4. Guzzle をインストールします

$ php artisan test:multithreading-requesthello
ログイン後にコピー

コードを直接投稿してください

実行可能なコードは千の言葉に匹敵します。

次のコードは app/Console/Commands/MultithreadingRequest.php の内容です:

composer require guzzlehttp/guzzle "6.2"
ログイン後にコピー

実行結果:

<?php namespace App\Console\Commands;use GuzzleHttp\Client;use GuzzleHttp\Pool;use GuzzleHttp\Psr7\Request;use GuzzleHttp\Exception\ClientException;use Illuminate\Console\Command;class MultithreadingRequest extends Command{    private $totalPageCount;    private $counter        = 1;    private $concurrency    = 7;  // 同时并发抓取    private $users = ['CycloneAxe', 'appleboy', 'Aufree', 'lifesign',                        'overtrue', 'zhengjinghua', 'NauxLiu'];    protected $signature = 'test:multithreading-request';    protected $description = 'Command description';    public function __construct()    {        parent::__construct();    }    public function handle()    {        $this->totalPageCount = count($this->users);        $client = new Client();        $requests = function ($total) use ($client) {            foreach ($this->users as $key => $user) {                $uri = 'https://api.github.com/users/' . $user;                yield function() use ($client, $uri) {                    return $client->getAsync($uri);                };            }        };        $pool = new Pool($client, $requests($this->totalPageCount), [            'concurrency' => $this->concurrency,            'fulfilled'   => function ($response, $index){                $res = json_decode($response->getBody()->getContents());                $this->info("请求第 $index 个请求,用户 " . $this->users[$index] . " 的 Github ID 为:" .$res->id);                $this->countedAndCheckEnded();            },            'rejected' => function ($reason, $index){                $this->error("rejected" );                $this->error("rejected reason: " . $reason );                $this->countedAndCheckEnded();            },        ]);        // 开始发送请求        $promise = $pool->promise();        $promise->wait();    }    public function countedAndCheckEnded()    {        if ($this->counter < $this->totalPageCount){            $this->counter++;            return;        }        $this->info("请求结束!");    }}
ログイン後にコピー
同時実行数が 7 に設定されているため、7 つのリクエストが同時に送信されることに注意してください。ただし、返信を受け取る時点が異なります。

終わります。

:ビール: :ビール: :ビール:

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート