在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
相关产品推荐
相关产品推荐

