我的问题是我想从API网页访问json数据,每秒只允许10次调用。在10个调用添加到处理程序后,我执行它们,然后每个结果都被解码,处理的数据和卷曲会话将从处理程序中删除。
平均而言,一次呼叫大约需要600毫秒(11600个呼叫的结果)。我打电话给10后如何停止打电话给新人?我试图使用usleep(并且它可以工作),但它减慢了所有非常重的东西。 Somtimes大约20秒〜这是延迟卷曲调用的唯一方法,或者如何更改此代码以提高效率?
$i = 0;
$run = NULL;
do {
curl_multi_add_handle($handler, $curls[$i++]);
while ($i < $curl_count && $i % 10 != 0) {
curl_multi_add_handle($handler, $curls[$i++]);
}
curl_multi_exec($handler, $running);
do {
if (curl_multi_select($handler) != -1) {
curl_multi_exec($handler, $running);
}
} while ($running > 0);
while ($msg = curl_multi_info_read($handler)) {
$exec_time[] = curl_getinfo($msg['handle'], CURLINFO_TOTAL_TIME);
$response = curl_multi_getcontent($msg['handle']);
$results = json_decode($response);
processData() // function to process data
curl_multi_remove_handle($handler, $msg['handle']);
}
$waiting_time = 1 - max($exec_time);
if ($waiting_time > 0) {
usleep(1000000 * $waiting_time);
}
$exec_time = NULL;
usleep(100 * 1000);
} while ($i < count($curls));
curl_multi_close($handler);
编辑更新了解决错误并改进错误的代码。请参阅修改以查看更改内容。
答案 0 :(得分:0)
您可能需要设置一个计时器,并且只能睡眠达到1秒间隔所需的时间,而不是硬编码的1秒钟。如下所示:
// start loop here
$start_time = microtime();
// run your 10 cURL requests here
$end_time = microtime();
$udelay = 1000000 * (1 - ($end_time - $start_time));
if ($udelay > 0) {
usleep($delay);
}
// end loop here
顺便说一句,这似乎是curl_multi
的一个相当基本的用法。如果你愿意,你可以看看我写的这个基于curl的轻量级REST客户端。通过异常处理等方式,这将使您更加健壮。