PHP中多次调用cURL返回数据被覆盖问题求助
解决cURL循环获取JSON时数据被覆盖的问题
看起来你遇到的核心问题是每次循环都直接覆盖了存储结果的变量,而没有把每个URL的响应都追加到数组中保存。咱们一步步来修正这个问题:
问题根源分析
你的代码应该是在循环里将每次的cURL响应直接赋值给了同一个变量(比如$response),没有做数组追加操作。这样循环结束后,变量自然只会保留最后一次请求的结果。
修正后的完整代码示例
<?php $urls = [ 'https://example.com/projects/277199/roles.json', 'https://example.com/projects/292291/roles.json' ]; // 初始化空数组,专门存储所有URL的响应结果 $all_responses = []; foreach ($urls as $key => $url) { $ch = curl_init(); // 设置cURL核心选项 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 让响应返回给变量而非直接输出 // 若目标是HTTPS站点,可根据情况添加以下选项(跳过证书验证,仅测试用) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 执行请求并获取响应 $response = curl_exec($ch); // 检查cURL请求是否成功 if (curl_errno($ch)) { $error_msg = curl_error($ch); $all_responses[$key] = ['error' => $error_msg]; // 错误信息也存入数组方便排查 } else { // 将JSON响应解析为PHP关联数组(第二个参数为true返回数组,false返回对象) $json_data = json_decode($response, true); $all_responses[$key] = $json_data; } // 关闭cURL句柄,释放服务器资源 curl_close($ch); } // 现在$all_responses里就保存了所有URL的完整响应数据 print_r($all_responses); ?>
关键改进点
- 新增
$all_responses空数组,专门存储每个URL的结果,彻底避免数据覆盖 - 加入cURL错误处理逻辑,能捕获请求失败的情况,方便调试
- 每次循环后关闭cURL句柄,避免不必要的资源泄漏
- 使用
json_decode将JSON字符串转为PHP可操作的数组/对象,便于后续业务处理
可选优化:复用cURL句柄
如果需要请求的URL数量较多,每次创建和关闭cURL句柄会有性能损耗,你可以复用同一个句柄:
<?php $urls = [ 'https://example.com/projects/277199/roles.json', 'https://example.com/projects/292291/roles.json' ]; $all_responses = []; $ch = curl_init(); // 设置通用cURL选项(无需每次循环重复设置) curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 其他通用配置... foreach ($urls as $key => $url) { curl_setopt($ch, CURLOPT_URL, $url); // 仅更新请求URL $response = curl_exec($ch); // 重复错误处理与数据解析逻辑 if (curl_errno($ch)) { $all_responses[$key] = ['error' => curl_error($ch)]; } else { $all_responses[$key] = json_decode($response, true); } } curl_close($ch); print_r($all_responses); ?>
这样修改后,你就能获取到所有URL的响应数据,再也不会出现被覆盖的问题啦~
内容的提问来源于stack exchange,提问作者NullEins
相关产品推荐
相关产品推荐

