alexpw / multicurl-iterator
此软件包的最新版本(0.1.0)没有提供许可证信息。
0.1.0
2014-09-15 04:19 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- alexpw/timer: dev-master
This package is not auto-updated.
Last update: 2024-09-24 08:02:46 UTC
README
此迭代器类使使用PHP的多curl变得简单。
然而,它不会为您调用curl_init()。相反,它让您完全控制您将发出的请求。
安装
Composer/Packagist
基本用法
- 您实例化一个 Multicurl\Iterator 实例。
- 您给它一些从 curl_init() 获取的 curl 资源句柄。
- 您开始遍历结果。
$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 句柄,它们可以在任何时间添加。
- 设置您的数据
- 您实例化一个 Multicurl\Iterator 实例。
- 您配置选项。
- 您给它一些从 curl_init() 获取的 curl 资源句柄。
- 您开始遍历结果。
$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 文件。