Guzzle 编写多线程爬虫实战

说明

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机构。

你可能感兴趣的:(Guzzle 编写多线程爬虫实战)