如何用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
相关产品推荐
相关产品推荐

