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

