如何解决cURL_multi多URL同时请求仅返回最后一个响应的问题
问题分析与修复方案
代码存在的核心问题
- 语法错误:
$headers数组定义后未添加闭合的);,导致PHP解析代码时出错,后续逻辑无法正常执行。 - 变量覆盖:遍历响应数组时,使用
foreach ($response as $i => $response),循环变量名与原数组名重复,会覆盖原响应数组,最终仅能保留最后一条URL的响应结果。 - 输出逻辑缺陷:最后仅打印
$color[$i],此时$i是最后一次循环的索引,只能输出最后一个URL对应的颜色,无法展示所有URL的结果。
修复后的完整代码
<?php // 待请求的URL数组 $urls = array( 'https://example.com/v1/objects/services?service=1', 'https://example.com/v1/objects/services?service=2' ); // 初始化cURL多句柄 $mh = curl_multi_init(); $username = "root"; $password = "apipass"; $headers = array( 'Accept: application/json', 'X-HTTP-Method-Override: GET' ); // 修复:添加数组闭合符 // 将每个URL添加到cURL多句柄 foreach ($urls as $i => $url) { $ch[$i] = curl_init(); curl_setopt_array($ch[$i], array( CURLOPT_URL => $url, CURLOPT_HTTPHEADER => $headers, CURLOPT_USERPWD => $username . ":" . $password, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0 )); curl_multi_add_handle($mh, $ch[$i]); } // 执行多cURL请求 do { $status = curl_multi_exec($mh, $active); } while ($status === CURLM_CALL_MULTI_PERFORM || $active); // 获取每个请求的响应 $response = []; foreach ($urls as $i => $url) { $response[$i] = curl_multi_getcontent($ch[$i]); } // 关闭所有句柄 foreach ($urls as $i => $url) { curl_multi_remove_handle($mh, $ch[$i]); } curl_multi_close($mh); // 根据响应设置对应颜色 $color = []; foreach ($response as $i => $res) { // 修复:修改循环变量名,避免覆盖原数组 if(strpos($res, "Unreachable") !== false) { $color[$i] = 'red'; } else { $color[$i] = 'green'; } } // 输出所有URL的状态和对应颜色 foreach ($urls as $i => $url) { echo "URL: {$url} | 状态颜色: {$color[$i]}\n"; } ?>
修复说明
- 补全了
$headers数组的闭合符号,解决语法解析错误。 - 修改响应遍历的循环变量名为
$res,避免覆盖原$response数组,确保能保留所有URL的响应结果。 - 调整输出逻辑,遍历所有URL和对应的颜色,完整展示每个请求的结果。
内容的提问来源于stack exchange,提问作者tata
相关产品推荐
相关产品推荐

