alexpw/multicurl-iterator

此软件包的最新版本(0.1.0)没有提供许可证信息。

0.1.0 2014-09-15 04:19 UTC

This package is not auto-updated.

Last update: 2024-09-24 08:02:46 UTC


README

此迭代器类使使用PHP的多curl变得简单。

然而,它不会为您调用curl_init()。相反,它让您完全控制您将发出的请求。

安装

Composer/Packagist

基本用法

  1. 您实例化一个 Multicurl\Iterator 实例。
  2. 您给它一些从 curl_init() 获取的 curl 资源句柄。
  3. 您开始遍历结果。
$mci = new Alexpw\Multicurl\Iterator();

foreach ($curl_handles as $handle) {
	$mci->add($handle /*[, mixed $data = null] */);
}

foreach ($mci as $result) {
	doSomething($result);
}

它将执行您允许的尽可能多的 curl 请求。一旦收到第一个响应,遍历就可以继续,您将获得解析响应的 $result

$result 的内容

一个近似值

$result = curl_getinfo($ch);
$result['handle']   = $ch;
$result['data']     = // Optional data associated with curl handle
$result['header']   = $header_string_or_parsed_array;
$result['body']     = $body_string;
$result['errno']    = curl_errno($ch);
$result['error']    = curl_error($ch);
$result['errorstr'] = curl_errstr($ch); // when function_exists

$data,或如何标识一个请求

结果是无序返回,一旦准备就绪就返回,但您可以轻松地标识它们。

最方便的方式:$mci->add($handle, $data = null);

$data 可以是您认为有意义的任何内容

  • 一个唯一的 ID
  • 请求参数的副本
  • 任何其他内容

选项

  • 同时执行多少个 curl 请求。

$mci->setMaxExecuting(10); // 默认:10

  • 将响应头解析为数组(如果您的请求请求了头)。 $mci->setParseResponseHeader(true); // 默认:true

  • 是否在使用后自动关闭 curl 句柄。

$mci->setCloseCurlHandles(true); // 默认:true

注意,如果您希望能够重用 curl 句柄进行重试或其他操作,您需要自己管理和关闭它们。

实际应用

您不需要预先创建所有的 curl 句柄,它们可以在任何时间添加。

  1. 设置您的数据
  2. 您实例化一个 Multicurl\Iterator 实例。
  3. 您配置选项。
  4. 您给它一些从 curl_init() 获取的 curl 资源句柄。
  5. 您开始遍历结果。
$article_ids       = array(1, 2, 3, 4 /*,...*/);
$article_id_chunks = array_chunk($article_ids, 50);

$curr_chunk   = 0;
$total_chunks = count($article_id_chunks);

function addArticlesToIterator($mci, $chunk)
{
	foreach ($chunk as $article_id) {
		$ch = initCurlHandleForArticle($article_id);
		$mci->add($ch, $article_id);
	}
}

$mci = new Alexpw\Multicurl\Iterator();
$mci->setMaxExecuting(6);

addArticlesToIterator($mci, $article_id_chunks[$curr_chunk++]);

foreach ($mci as $result) {
	if ($mci->getCountPendingRequests() < 10 &&
		$curr_chunk < $total_chunks) {
		addArticleRequests($mci, $article_id_chunks[$curr_chunk++]);
	}

	if ($result['errno'] !== 0) {
		logFailed($result);
	} elseif ($result['http_code'] === 408) {
		$ch = initCurlHandleForRetry($result);
		$mci->add($ch);
    } else {
		doSomething($result);
    }
}

许可证

Multicurl Iterator 在 MIT 许可证下授权 - 详细信息请参阅 LICENSE 文件。