说明
Guzzle 库是一套强大的 PHP HTTP 请求套件。
本文重点演示如何使用 Guzzle 发起多线程请求。
参考
Github 官方用户接口文档
Guzzle 并发请求文档
Laravel LTS 5.1 - Artisan 文档
创建命令
1. 运行命令行创建命令
php artisan make:consoleMultithreadingRequest--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-request
hello
4. 安装 Guzzle
composerrequireguzzlehttp/guzzle"6.2"
直接贴代码
一份可运行的代码胜过千言万语呀。
下面代码是 app/Console/Commands/MultithreadingRequest.php 里的内容:
useGuzzleHttp\Client;
useGuzzleHttp\Pool;
useGuzzleHttp\Psr7\Request;
useGuzzleHttp\Exception\ClientException;
useIlluminate\Console\Command;
classMultithreadingRequestextendsCommand
{
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';
publicfunction__construct()
{
parent::__construct();
}
publicfunctionhandle()
{
$this->totalPageCount=count($this->users);
$client=newClient();
$requests=function($total)use($client){
foreach($this->usersas$key=>$user){
$uri='https://api.github.com/users/'.$user;
yieldfunction()use($client,$uri){
return$client->getAsync($uri);
};
}
};
$pool=newPool($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();
}
publicfunctioncountedAndCheckEnded()
{
if($this->counter<$this->totalPageCount){
$this->counter++;
return;
}
$this->info("请求结束!");
}
}
运行结果:
$ php artisan test:multithreading-request
请求第5个请求,用户zhengjinghua的GithubID为:3413430
请求第6个请求,用户NauxLiu的GithubID为:9570112
请求第0个请求,用户CycloneAxe的GithubID为:6268176
请求第1个请求,用户appleboy的GithubID为:21979
请求第2个请求,用户Aufree的GithubID为:5310542
请求第3个请求,用户lifesign的GithubID为:2189610
请求第4个请求,用户overtrue的GithubID为:1472352
请求结束!
注意请求是同时发送过去的,因为concurrency并发设置了7,所以7个请求同时发送,只不过接收到返回的时间点不一样。
如果你觉得眼前需要更好的提高你可以来千锋学PHP,国内排名第一的PHP机构。