为何多并行AJAX请求间会出现1秒以上等待延迟?
并行AJAX请求部分出现长TTFB(约1秒卡顿)问题
当向后端同时发送1个以上并行AJAX请求时,部分请求能在<100ms内正常响应,但部分请求会在返回响应前卡顿约1秒(长TTFB),该现象与请求执行顺序无关。
测试环境与结果
为复现问题,编写了极简HTML+jQuery/PHP前后端脚本,创建6个并行AJAX请求,分别在本地服务器及配置相同的DigitalOcean服务器(Debian 10 Apache + PHP 7.4)上运行:
- 本地服务器测试结果:部分请求TTFB约1秒,其余请求响应正常
- DigitalOcean服务器测试结果:同样出现部分请求TTFB长达1秒的情况
测试代码
JavaScript代码
function ajaxAtOnce() { $.get("ajax1.php", function (data) { console.log(data); }); $.get("ajax2.php", function (data) { console.log(data); }); $.get("ajax3.php", function (data) { console.log(data); }); $.get("ajax4.php", function (data) { console.log(data); }); $.get("ajax5.php", function (data) { console.log(data); }); $.get("ajax6.php", function (data) { console.log(data); }); }
PHP端点代码(所有端点代码一致)
<?php // 返回100个随机排序的数字 $array = range(1,100); shuffle($array); echo json_encode($array); ?>
关键现象说明
- 若在AJAX请求间设置足够长的延迟,所有请求均可在预期时间内响应:
function ajaxWithTimeout() { setTimeout(function() { $.get("ajax1.php", function (data) { console.log(data); }); }, 1000); setTimeout(function() { $.get("ajax2.php", function (data) { console.log(data); }); }, 2200); setTimeout(function() { $.get("ajax3.php", function (data) { console.log(data); }); }, 3500); setTimeout(function() { $.get("ajax4.php", function (data) { console.log(data); }); }, 4700); setTimeout(function() { $.get("ajax5.php", function (data) { console.log(data); }); }, 5900); setTimeout(function() { $.get("ajax6.php", function (data) { console.log(data); }); }, 7100); }
- 若所有请求发送至同一端点(如ajax1.php),则无此问题
- 已排查过相关服务器参数
RateLimitInterval=30s, RateLimitBurst=1000,无论是默认值还是取消限制,均无法解决问题
该问题在React等JS框架开发SPA时影响明显,最初便是在这类场景中发现此问题。
补充信息
- 本地服务器采用CGI/FastCGI模式运行PHP
内容的提问来源于stack exchange,提问作者Dino Cagalj
相关产品推荐
相关产品推荐

