說明
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: