所以我有这个功能来进行非阻塞卷曲请求。它在我到目前为止测试的内容(少量请求)上工作正常。但我需要将其扩展到数千个请求(可能最多10,000个)。我的问题是我不想遇到同时运行太多并行请求的问题。
您建议对请求进行速率限制? Usleep?批量请求?功能如下:
function poly_curl($requests){
$queue = curl_multi_init();
$curl_array = array();
$count = 0;
foreach($requests as $request)
{
$curl_array[$count] = curl_init($request);
curl_setopt($curl_array[$count], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($queue, $curl_array[$count]);
$count++;
}
$running = NULL;
do {
curl_multi_exec($queue,$running);
} while($running > 0);
$res = array();
$count = 0;
foreach($requests as $request)
{
$res[$count] = curl_multi_getcontent($curl_array[$count]);
$count++;
}
$count = 0;
foreach($requests as $request){
curl_multi_remove_handle($queue, $curl_array[$count]);
$count++;
}
curl_multi_close($queue);
return $res;
}
答案 0 :(得分:2)
我认为curl_multi_exec
不利于此目的,因为即使您使用100个组中的批次,也可以完成99个请求,但仍需要等待上次请求完成。
但是你需要100个并行请求,当一个完成时,另一个立即启动。所以你根本不能使用curl_multi_exec
。
我会使用普通的生产者 - 消费者算法和多个(常数)消费者,每个消费者只处理一个网址。例如php-resque和COUNT=100 php resque.php
答案 1 :(得分:1)
您可能希望实现一种称为指数退避(wikipedia)的内容。
基本上,它是一种算法,允许您根据一些反馈动态调整流程。
您可以在应用程序中定义费率,并在第一次超时,错误或您决定的任何内容时,在请求完成之前降低此费率。
例如,您可以使用HTTP响应代码轻松实现它。
答案 2 :(得分:0)
上次我做这样的事情时,包括下载和解析"文件。能够在非常弱的硬件处理器(带有HT的2个核心)限制的时间内仅进行4个子页面。什么时候我最终得到两个队列:1代表等待,2代表正在进行中。每当一个任务从第二个队列中消失时,就会从第一个队列中获取新任务。
可能很复杂,但在另一个内部以两个循环结束并简单count()
&#39>
PS:很好&有用的代码,谢谢。
答案 3 :(得分:0)
我们过去常常遇到与C ++连接池代码相同的问题。这种方法涉及到一些严肃的分析。
但是,重要的是,我们创建了一个池,并根据可用请求的数量处理请求。我们还做了什么是分配最大数量的连接池。[这是通过测试确定的]。
您真正需要的是一种方法,用于确定正在处理的请求数量并对其设置限制。在您的情况下是$ count
只需将$ count与最大值[比如$ max]进行比较,然后停在那里。根据程序运行的系统定义值。 $ max可以是硬编码或动态的。