h4cc/guzzle-rolling-batch

用于Guzzle请求的并行执行器。

1.0 2013-10-17 13:24 UTC

This package is not auto-updated.

Last update: 2024-09-09 15:26:27 UTC


README

Build Status Scrutinizer Quality Score SensioLabsInsight

这是一个为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)