h4cc / guzzle-rolling-batch
用于Guzzle请求的并行执行器。
Requires
- ext-curl: *
- guzzle/http: ~3.0
Requires (Dev)
- phing/phing: ~2.6
- phpunit/phpunit: ~3.7
- react/http: ~0.3
- symfony/process: ~2.3
This package is not auto-updated.
Last update: 2024-09-09 15:26:27 UTC
README
这是一个为Guzzle提供的并行执行器,可以并行处理多个请求。它不是一次性处理一批请求,而是有两个队列分别用于请求和响应,以动态处理执行过程,包括添加新请求和处理响应。
简介
当使用批量系统构建爬虫时,会存在多个问题。使用批量处理会浪费时间等待最后一个请求的结果。响应处理不是完全并行的,添加和准备新请求也没有实现并行。当启动批量时,目标网站的结果更像是微型的DOS攻击。为了避免这些问题,创建了RollingBatch。
安装
使用composer通过名称要求该包
$ php composer.phar require h4cc/guzzle-rolling-batch
跟随'dev-master'分支获取最新开发版本。但如果可用,我推荐使用更稳定的版本标签。
用法
RollingBatch由三部分组成。请求队列、响应队列和RollingBatch。让我们看看每一部分。
请求队列
新请求必须添加到请求队列中。然后,RollingBatch使用'next()'方法从那里获取它们。
如果您需要一个更灵活的方法,可以实现自己的请求队列。
响应队列
收到的响应将添加到响应队列中。从那里,如果需要,可以获取并处理它们。
同样,实现自己的响应队列也是进一步功能的一个选项。
RollingBatch
RollingBatch有一些用于控制流程的方法。运行'execute()'以启动新请求并执行已启动的请求。可以通过'countActive()'和'isIdle()'获取当前状态。
一次性处理一个或多个请求的示例
use Guzzle\Http\Message\Request; use h4cc\GuzzleRollingBatch\RollingBatch; $request = new Request('GET', 'http://example.com/'); $request->getCurlOptions()->set(CURLOPT_TIMEOUT_MS, 1000); // 1 Second $batch = new RollingBatch(); $batch->getRequestQueue()->add($request); do { // Calling execute once will _not_ guarantee to finish all started requests. $batch->execute(); } while (!$batch->isIdle()); $response = $batch->getResponseQueue()->next();
请注意,仅使用'countActive()'可能不足以作为循环等的情况的谓词。
还可以通过'setNumberParallel()'限制当前执行的并行请求数量。将值设置为'0'将禁用限制。在运行过程中也可以减少并行请求的数量。
事件
还可以使用Guzzle请求事件。
例如,监听异常。
use Guzzle\Common\Event; $request->getEventDispatcher()->addListener('request.exception', function(Event $event) { throw $event['exception']; });
有关更多事件,请参阅此处:[http://guzzlephp.org/http-client/request.html#events-emitted-from-a-request](http://guzzlephp.org/http-client/request.html#events-emitted-from-a-request)