Laravel 下使用 Guzzle 編寫多線程爬蟲實戰

來源:互聯網
上載者:User

說明

Guzzle庫是一套強大的 PHP HTTP 要求套件。

本文重點示範如何使用 Guzzle 發起多線程請求。

參考

  • Github 官方使用者介面文檔
  • Guzzle 並發請求文檔
  • Laravel LTS 5.1 - Artisan 文檔

建立命令

1. 運行命令列建立命令

php artisan make:console MultithreadingRequest --command=test:multithreading-request

2. 註冊命令

編輯 app/Console/Kernel.php,在 $commands 數組中增加:

Commands\MultithreadingRequest::class,

3. 測試下命令

修改 app/Console/Commands/MultithreadingRequest.php檔案,在 handle方法中增加:

$this->info('hello');

輸出:

$ php artisan test:multithreading-requesthello

4. 安裝 Guzzle

composer require guzzlehttp/guzzle "6.2"

直接貼代碼

一份可啟動並執行代碼勝過千言萬語呀。

下面代碼是 app/Console/Commands/MultithreadingRequest.php裡的內容:

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("請求結束!");    }}

運行結果:

$ php artisan test:multithreading-request請求第 5 個請求,使用者 zhengjinghua 的 Github ID 為:3413430請求第 6 個請求,使用者 NauxLiu 的 Github ID 為:9570112請求第 0 個請求,使用者 CycloneAxe 的 Github ID 為:6268176請求第 1 個請求,使用者 appleboy 的 Github ID 為:21979請求第 2 個請求,使用者 Aufree 的 Github ID 為:5310542請求第 3 個請求,使用者 lifesign 的 Github ID 為:2189610請求第 4 個請求,使用者 overtrue 的 Github ID 為:1472352請求結束!

注意請求是同時發送過去的,因為 concurrency並發設定了 7,所以 7 個請求同時發送,只不過接收到返回的時間點不一樣。

完。

:beers: :beers: :beers:

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.