在PHP中如何处理curl_multi多请求返回的多个响应JSON数据
解决方法
你用curl_multi获取到的每个$response都是独立的合法JSON字符串,和单请求解析逻辑完全一致,直接在遍历响应的循环中逐个解析即可,不需要额外的特殊处理。
调整后的代码示例
只需要修改你现有代码中处理响应的foreach分支即可,完整修改片段如下:
foreach (array_keys($chs) as $key) { $error = curl_error($chs[$key]); $last_effective_URL = curl_getinfo($chs[$key], CURLINFO_EFFECTIVE_URL); $time = curl_getinfo($chs[$key], CURLINFO_TOTAL_TIME); $response = curl_multi_getcontent($chs[$key]); // get results if (!empty($error)) { echo "请求 $key 发生错误: $error" . "\n"; } else { echo "请求 '$last_effective_URL' 耗时 $time 秒,返回结果如下:" . "\n"; echo "<pre>"; echo $response; echo "</pre>"; // 新增JSON解析逻辑 $responseData = json_decode($response, true); // 校验JSON解析结果 if (json_last_error() !== JSON_ERROR_NONE) { echo "<p style='color:red;'>请求 {$key} JSON解析失败:" . json_last_error_msg() . "</p>"; continue; } // 按返回结构提取字段示例 if (isset($responseData['Vehicles'])) { foreach ($responseData['Vehicles'] as $vehicle) { $externalVehicleId = $vehicle['ExternalVehicleId']; $stockId = $vehicle['StockId']; $errors = $vehicle['Errors']; // 这里写你的业务逻辑,比如存储数据、打印结果等 echo "<p>车辆接口返回:外部ID = {$externalVehicleId},库存ID = {$stockId}</p>"; if (!empty($errors)) { echo "<p>车辆接口错误:" . implode(';', $errors) . "</p>"; } } } elseif (isset($responseData['Finance'])) { foreach ($responseData['Finance'] as $finance) { $externalVehicleId = $finance['ExternalVehicleId']; $stockId = $finance['StockId']; $errors = $finance['Errors']; // 业务逻辑 echo "<p>金融接口返回:外部ID = {$externalVehicleId},库存ID = {$stockId}</p>"; } } } curl_multi_remove_handle($mh, $chs[$key]); }
补充说明
json_decode第二个参数传true会将JSON解析为PHP关联数组,不传则返回对象,对应取值方式调整为$responseData->Vehicles即可,可根据个人开发习惯选择。- 遇到嵌套层级更深的字段时,取值前优先用
isset()判断字段是否存在,避免PHP抛出未定义索引的警告,例如取$vehicle['ext_info']['price']前先判断isset($vehicle['ext_info']['price'])。 - 如果你的请求地址和返回结构是和
$urls数组的下标固定对应的,也可以直接通过$key判断接口类型,不需要判断返回的根键名。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

