You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:20:55