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

如何优化PHP cURL多API调用速度?循环内调用接口加载过慢

性能优化方案

当前性能瓶颈确实为循环内的串行API调用,20条用户数据对应40次串行HTTP请求,累计的网络IO、连接建立开销直接导致总耗时过高,可按优先级采用以下优化方案:

1. 替换单条查询为批量查询(优先级最高)

从根源减少请求次数,优化效果最明显

  • 拉取到全量用户基础数据后,统一提取所有需要查询库存的用户唯一标识(如用户ID),组成ID集合
  • 协调上游接口提供方改造两个库存接口为批量查询版本,一次传入10~20个ID批量返回对应所有数据,20条数据的场景下仅需额外发起2次请求,替代原有的40次串行请求,耗时可直接降低90%以上
  • 若暂时无法改造上游接口,优先采用并发请求替换串行请求

2. 串行请求改为并发请求

无需改造上游接口即可大幅降低耗时

  • 用异步HTTP客户端、多协程、多进程的方式同时发起多个请求,把串行等待的累计耗时压缩到接近单次请求的最高耗时
  • PHP场景可直接用Guzzle的异步请求功能,或者原生curl_multi_*系列函数实现,示例逻辑如下:
// 初始化Guzzle客户端
$client = new GuzzleHttp\Client();
$promises = [];
$userList = getUserBaseData(); // 调用用户表接口拿到的基础数据
foreach ($userList as $user) {
    // 同时加入两个库存接口的异步请求
    $promises['available_' . $user['id']] = $client->getAsync('/stock/available?uid=' . $user['id']);
    $promises['user_stock_' . $user['id']] = $client->getAsync('/user/stock?uid=' . $user['id']);
}
// 等待所有请求完成
$responses = GuzzleHttp\Promise\unwrap($promises);
// 处理响应合并数据

20条数据对应的40个请求可同时发起,总耗时仅等于最慢的单个接口响应时间,不会累计叠加。

3. 增加缓存层降低重复请求开销

  • 根据业务可接受的一致性要求,对用户基础数据、库存查询结果设置合理有效期的缓存(如Redis缓存5分钟),相同ID的重复查询直接读取缓存无需发起HTTP请求
  • 日常访问场景下缓存命中率可达60%以上,可进一步降低请求量

4. 网络层面优化

  • 若三个接口均为内部服务,将公网HTTP调用改为内网调用,或改用RPC协议调用,减少公网传输、HTTP协议解析的开销
  • 开启HTTP Keep-Alive复用TCP连接,减少每次请求的TCP握手、TLS握手开销

5. 前端渲染优化

  • 后端全量合并数据后再返回前端渲染,避免边请求边渲染导致的DOM频繁重绘重排
  • 后续数据量上涨后可新增分页、虚拟滚动能力,降低前端渲染压力

内容的提问来源于stack exchange,提问作者A. Chithrai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:09:03