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

如何用PHP Curl Multi优化同URL多JSON请求以减少延迟?

使用cURL Multi并行处理多请求优化延迟问题

下面是改写后的并行请求代码,用cURL Multi同时发起两个请求,消除串行等待的延迟:

<?php
// 准备两个请求的JSON数据与请求头
$requests = [
    [
        'data' => ["epic" => $epic, "expiry" => "DFB"],
        'headers' => [
            'Content-Type: application/json; charset=UTF-8',
            'Accept: application/json; charset=UTF-8',
            'X-IG-API-KEY: '.$xapikey,
            'Version: 1',
            'X-SECURITY-TOKEN: '.$_SESSION['api_xtoken'],
            'CST: ' .$_SESSION['api_cst'],
            '_method: DELETE',
        ]
    ],
    [
        'data' => ["currencyCode" => "GBP", "direction" => $tv_direction],
        'headers' => [
            'Content-Type: application/json; charset=UTF-8',
            'Accept: application/json; charset=UTF-8',
            'X-IG-API-KEY: '.$xapikey,
            'Version: 1',
            'X-SECURITY-TOKEN: '.$_SESSION['api_xtoken'],
            'CST: ' .$_SESSION['api_cst'],
            // 若第二个请求需要不同请求头,在此修改即可
        ]
    ]
];

// 初始化cURL Multi句柄
$multiHandle = curl_multi_init();
$curlHandles = [];

// 批量创建并配置单个cURL句柄,加入Multi队列
foreach ($requests as $index => $req) {
    $ch = curl_init($trading_url);
    
    // 通用请求配置
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    
    // 绑定当前请求的JSON数据
    $dataString = json_encode($req['data']);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
    
    // 绑定当前请求的自定义头
    curl_setopt($ch, CURLOPT_HTTPHEADER, $req['headers']);
    
    $curlHandles[$index] = $ch;
    curl_multi_add_handle($multiHandle, $ch);
}

// 执行并行请求,直到所有请求完成
$running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

// 收集每个请求的返回结果
$results = [];
foreach ($curlHandles as $index => $ch) {
    $results[$index] = curl_multi_getcontent($ch);
    // 清理单个cURL句柄资源
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 关闭Multi句柄
curl_multi_close($multiHandle);

// 结果使用示例:$results[0]对应第一个请求,$results[1]对应第二个请求
// var_dump($results[0], $results[1]);
?>

核心要点说明

  • 批量管理请求:把两个请求的差异化数据(JSON、请求头)统一放到数组中,循环创建句柄,避免重复代码。
  • 并行执行逻辑:curl_multi_exec驱动所有请求同时发起,curl_multi_select等待请求状态变化,直到全部请求完成,彻底消除串行等待的延迟。
  • 独立配置支持:每个cURL句柄可以单独设置POSTFIELDS和HTTPHEADER,完全满足不同请求的差异化需求。
  • 资源清理:请求完成后必须移除并关闭单个句柄,最后关闭Multi句柄,避免资源泄漏。

注:原代码中$headers2如果是笔误,需确保第二个请求的请求头配置正确;若两个请求的请求头大部分相同,可提取公共部分减少代码冗余。

内容的提问来源于stack exchange,提问作者Nicky Green

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:57:52