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

在foreach循环中使用curl_multi_exec发送多请求无数据问题求助

解决curl_multi_exec批量请求无法获取数据的问题

我来帮你排查下这个问题!你目前的代码只完成了初始化部分,缺少了curl_multi_exec的核心执行逻辑以及结果提取、资源清理的步骤,这就是拿不到数据的主要原因。下面我帮你补全代码并解释关键要点:

完整修正后的代码

<?php
$multiCurl = array();
$result = array();
$mh = curl_multi_init();

foreach ($members as $mem => $id) {
    $c = $mem["ta"];
    $urll = "https://api.abcd.com/" . urlencode($c);
    $tokenq = "abcd";

    // 初始化单个curl句柄
    $multiCurl[$mem] = curl_init();
    
    // 关键设置:让curl返回结果而不是直接输出
    curl_setopt($multiCurl[$mem], CURLOPT_URL, $urll);
    curl_setopt($multiCurl[$mem], CURLOPT_RETURNTRANSFER, true);
    // 补全你的请求头(示例用JSON格式,根据API实际要求调整)
    curl_setopt($multiCurl[$mem], CURLOPT_HTTPHEADER, array(
        "Accept: application/json",
        "Authorization: Bearer " . $tokenq // 如果API需要token认证
    ));
    // 测试环境临时禁用SSL验证(生产环境务必删除这两行)
    // curl_setopt($multiCurl[$mem], CURLOPT_SSL_VERIFYPEER, false);
    // curl_setopt($multiCurl[$mem], CURLOPT_SSL_VERIFYHOST, false);
    
    // 将单个请求句柄加入到multi批量句柄中
    curl_multi_add_handle($mh, $multiCurl[$mem]);
}

// 核心:执行批量请求并等待所有请求完成
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh); // 等待请求响应,避免空循环占用CPU
} while ($running > 0);

// 提取每个请求的结果
foreach ($multiCurl as $mem => $ch) {
    // 获取请求返回的内容
    $result[$mem] = curl_multi_getcontent($ch);
    // 可选:检查请求是否有错误
    $errorMsg = curl_error($ch);
    if (!empty($errorMsg)) {
        $result[$mem] = "请求失败: " . $errorMsg;
    }
    // 清理单个请求资源
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// 关闭批量请求句柄
curl_multi_close($mh);

// 查看结果
print_r($result);
?>

关键注意事项

  • 必须设置CURLOPT_RETURNTRANSFER为true:默认curl会直接把结果输出到页面,开启这个选项后才会将返回内容以字符串形式返回,方便我们存入变量。
  • 不要忘记添加句柄到multi:用curl_multi_add_handle把单个curl句柄注册到批量句柄中,否则multi不会处理这个请求。
  • 正确的执行循环:do-while循环配合curl_multi_exec和curl_multi_select是标准写法,确保所有请求都处理完成,curl_multi_select能有效降低CPU占用。
  • 资源清理不能少:请求完成后要移除句柄、关闭单个curl和multi句柄,避免服务器资源泄漏。
  • 检查API参数和头信息:确认$mem["ta"]能拿到正确的参数值,请求头(比如Accept、Authorization)要符合API的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:53:21