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

如何将常规CURL请求转换为Multi CURL请求?附现有代码

转换为Multi CURL的实现方案

没问题!我帮你把这段循环执行的单CURL请求改成Multi CURL版本,这样能并行处理所有请求,相比逐个执行的方式,效率会提升很多。

下面是完整的实现代码,我会在代码后解释关键改动点:

// 初始化Multi CURL批处理句柄
$mh = curl_multi_init();
$curlHandles = [];

// 循环创建单个CURL句柄并添加到批处理中
for ($i = 0; $i < 300; $i++) {
    // 跳过数组越界的情况(确保$numbers_from和$messages有足够元素)
    if (!isset($numbers_from[$i]['number_from'], $messages[$i]['message_content'])) {
        continue;
    }

    // 创建单个CURL句柄
    $ch = curl_init();
    
    // 设置通用的CURL选项
    curl_setopt($ch, CURLOPT_URL, "websiteURL");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    // 注意去掉Content-Type前面的空格,避免HTTP头解析问题
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Content-Type: application/json",
        'Authorization: Basic ' . base64_encode("XXXXX:YYYYYY")
    ]);
    
    // 设置当前请求的POST数据(这里假设$messages[$i]里的字段是message_content,你可以根据实际调整)
    $postData = json_encode([
        "src" => $numbers_from[$i]['number_from'],
        "dst" => $messages[$i]['message_content']
        // 补充你原来代码里省略的其他字段
    ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    
    // 将句柄添加到批处理中
    curl_multi_add_handle($mh, $ch);
    // 保存句柄到数组,后续用于获取结果
    $curlHandles[] = $ch;
}

// 执行Multi CURL请求
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh); // 等待请求完成,避免CPU空转
} while ($running > 0);

// 处理每个请求的返回结果
$results = [];
foreach ($curlHandles as $ch) {
    // 获取请求结果
    $response = curl_multi_getcontent($ch);
    // 可以在这里解析JSON结果
    $results[] = json_decode($response, true);
    
    // 检查是否有错误
    if (curl_errno($ch)) {
        $error = curl_error($ch);
        // 处理错误逻辑,比如记录日志
        error_log("CURL请求错误: " . $error);
    }
    
    // 关闭单个CURL句柄
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// 关闭Multi CURL批处理句柄
curl_multi_close($mh);

// 现在$results里保存了所有请求的返回结果
print_r($results);

关键改动说明:

  • Multi CURL核心结构:用curl_multi_init()创建批处理句柄,通过curl_multi_add_handle()把单个请求句柄加入批处理,最后用curl_multi_exec()并行执行所有请求。
  • 避免CPU空转:加入curl_multi_select(),让程序在请求未完成时进入等待状态,不会占用过多CPU资源。
  • 结果处理:循环通过curl_multi_getcontent()获取每个请求的返回值,同时处理可能的请求错误。
  • 细节优化:去掉了HTTP头里Content-Type前面的多余空格,避免服务器解析头信息时出错;增加了数组索引检查,防止越界报错。

内容的提问来源于stack exchange,提问作者user9544660

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:37:53