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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:39:02