PHP多CURL请求添加延迟适配API每分钟1次调用限制
实现每分钟一次的API请求调度方案
由于API限制每分钟仅允许1次请求,我们需要在每完成一个请求后等待60秒再执行下一个。原Multi CURL代码缺少延迟逻辑,以下是修改后的完整实现:
function multi_thread_curl($urlArray, $optionArray, $nThreads) { // 将URL按线程数分组,这里nThreads=1,每组一个URL $curlArray = array_chunk($urlArray, $nThreads, true); $totalBatches = count($curlArray); $results = []; $ch = 'ch_'; // 遍历每个批次,带索引判断是否为最后一批 foreach ($curlArray as $batchIndex => $threads) { // 创建cURL资源 foreach ($threads as $thread => $value) { ${$ch . $thread} = curl_init(); curl_setopt_array(${$ch . $thread}, $optionArray); curl_setopt(${$ch . $thread}, CURLOPT_URL, $value); } // 初始化多cURL句柄 $mh = curl_multi_init(); // 添加所有cURL句柄到多句柄 foreach ($threads as $thread => $value) { curl_multi_add_handle($mh, ${$ch . $thread}); } $active = null; // 执行多cURL请求 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // 获取结果并关闭单个cURL句柄 foreach ($threads as $thread => $value) { $results[$thread] = curl_multi_getcontent(${$ch . $thread}); curl_multi_remove_handle($mh, ${$ch . $thread}); curl_close(${$ch . $thread}); // 释放单个cURL资源 } // 关闭多cURL句柄 curl_multi_close($mh); // 如果不是最后一个批次,等待60秒 if ($batchIndex < $totalBatches - 1) { sleep(60); } } return $results; } // 调用示例 $optionArray = array( CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_TIMEOUT => 20, CURLOPT_FOLLOWLOCATION => TRUE, // 可选:跟随重定向 CURLOPT_SSL_VERIFYPEER => FALSE, // 可选:HTTPS证书问题时临时关闭,生产环境建议开启 CURLOPT_SSL_VERIFYHOST => FALSE ); $nThreads = 1; // 每次仅请求1个URL,匹配API限制 $urlArray = array("url1", "url2", "url3", "url4", "url5", "url6", "url7", "url8", "url9", "url10"); $results = multi_thread_curl($urlArray, $optionArray, $nThreads); // 将结果保存为独立JSON文件 foreach ($results as $index => $jsonData) { $filename = "api_result_" . ($index + 1) . ".json"; file_put_contents($filename, $jsonData); }
关键修改说明
- 延迟控制:通过批次索引判断是否为最后一个请求,仅在非最后批次执行后等待60秒,避免额外等待时间。
- 资源优化:新增单个cURL句柄关闭逻辑,防止资源泄漏。
- 结果落地:添加JSON文件保存逻辑,直接将每个请求结果写入对应文件。
内容的提问来源于stack exchange,提问作者Deepak sahu
相关产品推荐
相关产品推荐

