首页 > 代码库 > 【转】关于“不同浏览器的并发异步请求”的简单研究
【转】关于“不同浏览器的并发异步请求”的简单研究
之前在开发过程中有发现在一个页面内同时对单个url发出多个Ajax请求最后完成回调的只有最后一个。具体是什么原因导致的呢?针对这个问题,本人做了进一步的测试。 对于单个页面内并发的异步请求分为以下几种情况:
- 并发多个相同url的请求
- 并发多个不同url的请求(参数不同,协议相同)
- 并发多个不同url的请求(参数和协议都不同)
测试方法: 客户端:同时发出N异步请求,并输出发出请求的时间;当服务器返回相应数据后将接受请求的时间输出,并输出之前所发送的请求的标识ID。 服务器:服务器接到请求后延时一秒再生成具体的内容返回HTTP请求。 下面测试的是用Ajax实现的异步请求,其中使用的是JQuery封装好的Ajax函数。
测试“并发多个相同的url请求”:
客户端:
- function multiSameUrlRequest() {
- for(var i = 0; i < 8; i++) {
- $.getJSON("json1.php", {}, function(data) {
- show(data);
- });
- showRequestSent("json1.php");
- }
- }
服务端:
- <?php
- function microtime_float()
- {
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec + (float)$sec);
- }
- $log_dir = "log.txt";
- $log = fopen($log_dir, ‘a‘) or die("can‘t open file");
- $timestamp = microtime_float().": get json1.php request\n";
- fwrite($log, $timestamp);
- sleep(1);
- echo ‘{ "msg": "json1\‘s response." }‘;
- $timestamp = microtime_float().": send json1.php request\n";
- fwrite($log, $timestamp);
- fclose($log);
- ?>
在客户端的程序中,连续对json1.php发送了8个请求。下面是在各个浏览器下的表现:
Chrome | Firefox | IE | |||
38.161 request json1.php. 38.162 request json1.php. 38.163 request json1.php. 38.165 request json1.php. 38.165 request json1.php. 38.166 request json1.php. 38.166 request json1.php. 38.167 request json1.php. 39.173 json1′s response. 40.177 json1′s response. 41.183 json1′s response. 42.188 json1′s response. 43.193 json1′s response. 44.205 json1′s response. 45.21 json1′s response. 46.222 json1′s response. | 49.035 request json1.php. 49.037 request json1.php. 49.039 request json1.php. 49.04 request json1.php. 49.041 request json1.php. 49.042 request json1.php. 49.044 request json1.php. 49.045 request json1.php. 50.054 json1′s response. 51.066 json1′s response. 52.078 json1′s response. 53.095 json1′s response. 54.116 json1′s response. 55.13 json1′s response. 56.144 json1′s response. 57.157 json1′s response. | 38.717 request json1.php. 38.718 request json1.php. 38.719 request json1.php. 38.721 request json1.php. 38.722 request json1.php. 38.723 request json1.php. 38.724 request json1.php. 38.726 request json1.php. 39.727 json1′s response. 39.727 json1′s response. 39.728 json1′s response. 39.728 json1′s response. 39.729 json1′s response. 39.729 json1′s response. 39.73 json1′s response. 39.73 json1′s response. | |||
0s 0.001s 0.002s 0.004s 0.004s 0.005s 0.005s 0.006 | 1.012s 2.016s 3.022s 4.027s 5.032s 6.044s 7.049s 8.061s | 0s 0.002s 0.004s 0.005s 0.006s 0.007s 0.009s 0.010s | 1.019s 2.031s 3.043s 4.06s 5.081s 6.095s 7.109s 8.122s | 0s 0.001s 0.002s 0.004s 0.005s 0.006s 0.007s 0.008s | 1.010s 1.010s 1.011s 1.011s 1.012s 1.012s 1.013s 1.013s |
服务器端处理请求日志:
Chrome | Firefox | IE | |||
55.25: get json1.php 56.25: send json1.php 56.33: get json1.php 57.33: send json1.php 57.36: get json1.php 58.36: send json1.php 58.37: get json1.php 59.38: send json1.php 59.39: get json1.php 60.39: send json1.php 60.4: get json1.php 61.41: send json1.php 61.41: get json1.php 62.42: send json1.php 62.43: get json1.php 63.44: send json1.php | 44.76: get json1.php 45.78: send json1.php 45.85: get json1.php 46.86: send json1.php 46.87: get json1.php 47.87: send json1.php 47.88: get json1.php 48.89: send json1.php 48.9: get json1.php 49.9: send json1.php 49.91: get json1.php 50.92: send json1.php 50.92: get json1.php 51.93: send json1.php 51.94: get json1.php 52.94: send json1.php | 97.77: get json1.php 97.77: get json1.php 97.79: get json1.php 97.79: get json1.php 97.79: get json1.php 97.79: get json1.php 97.79: get json1.php 97.8: get json1.php 98.78: send json1.php 98.77: send json1.php 98.79: send json1.php 98.8: send json1.php 98.79: send json1.php 98.8: send json1.php 98.8: send json1.php 98.82: send json1.php | |||
0s 1.08s 2.11s 3.12s 4.14s 5.15s 6.16s 7.18s | 1s 2.08s 3.11s 4.13s 5.14s 6.16s 7.17s 8.19s | 0s 1.09s 2.11s 3.12s 4.14s 5.15s 6.16s 7.18s | 1.02s 2.1s 3.11s 4.13s 5.14s 6.16s 7.17s 8.18s | 0s 0s 0.02s 0.02s 0.02s 0.02s 0.02s 0.03s | 1.01s 1s 1.02s 1.03s 1.02s 1.03s 1.03s 1.05s |
从上面三组数据汇总不难发现,在Chrome和Firefox中对同样Url的请求的数据表现情况基本一致;而在IE下,数据表现与另外两组相差甚大,即服务器返回数据的时间间隔完全与程序中所写的不符合。按照正常情况,从发送请求到接收到请求的时间差至少为1秒,IE下发送和返回请求的时间数据是我们所期望的;但在Chrome和Firefox下,每个请求的发送和返回时间与我们的预期很不一样。不难发现,在Chrome和Firefox下,JavaScript在客户端执行发送异步请求的语句的时间点基本一致,但请求返回的时间每个之间都相隔了1s左右,这个一秒也正是我们在服务器端所设置的延时长度。那这个时间差实在服务器端产生的还是在客户端产生的呢?根据上面的数据,我们猜测造成Chrome和Firefox请求返回时间差的原因是浏览器在发现页面内发送相同URL的多个异步请求,于是将相同URL的异步请求缓存,等先前的异步请求完成后,再将后面的异步请求发出。本人用Fiddler对期间的请求进行了监控:
Chrome:
IE:
从上面的两幅HTTP请求统计图不难发现,Chrome和Firefox下会对相同URL的异步请求阻塞,即任意时刻相同URL的异步请求同一页面内只能有一个处于“正在执行”的状态。
测试“并发多个不同url的请求(参数不同,协议相同)”:
在客户端程序中,连续对服务器端发送8个请求,其中都是请求json1.php,但带上了一个r参数,r是随机数,使得每个请求的URL不同(仅参数不同),下面的数据是在各浏览器中的表现:
Chrome | Firefox | IE | |||
46.061 request json1.php. 46.061 request json1.php. 46.062 request json1.php. 46.063 request json1.php. 46.063 request json1.php. 46.064 request json1.php. 46.064 request json1.php. 46.065 request json1.php. 47.37 json1′s response. 47.372 json1′s response. 47.373 json1′s response. 47.375 json1′s response. 47.378 json1′s response. 47.379 json1′s response. 48.375 json1′s response. 48.378 json1′s response. | 6.509 request json1.php. 6.511 request json1.php. 6.513 request json1.php. 6.515 request json1.php. 6.517 request json1.php. 6.519 request json1.php. 6.521 request json1.php. 6.523 request json1.php. 7.53 json1′s response. 7.535 json1′s response. 7.539 json1′s response. 7.564 json1′s response. 7.569 json1′s response. 7.572 json1′s response. 8.533 json1′s response. 8.538 json1′s response. | 28.832 request json1.php. 28.833 request json1.php. 28.834 request json1.php. 28.834 request json1.php. 28.835 request json1.php. 28.836 request json1.php. 28.837 request json1.php. 28.838 request json1.php. 29.891 json1′s response. 29.901 json1′s response. 29.901 json1′s response. 29.902 json1′s response. 29.902 json1′s response. 29.903 json1′s response. 29.903 json1′s response. 29.914 json1′s response. | |||
0s 0s 0.001s 0.002s 0.002s 0.003s 0.003s 0.004s | 1.309s 1.311s 1.312s 1.314s 1.317s 1.318s 2.314s 2.317s | 0s 0.002s 0.004s 0.006s 0.008s 0.010s 0.012s 0.014s | 1.021s 1.026s 1.03s 1.055s 1.06s 1.063s 2.024s 2.029 | 0s 0.001s 0.002s 0.002s 0.003s 0.004s 0.005s 0.006s | 1.059s 1.069s 1.069s 1.07s 1.07s 1.071s 1.071s 1.082s |
从上面的数据中,我们发现在Chrome和Firefox下,前六个请求的返回时间基本一致,第七第八个请求的返回时间也基本一致;而在IE下8个请求的返回时间都一致。对于这样的现象,猜测可能浏览器本身对于同一协议的访问数做了限制,于是在再次做了下面的测试,将并发数改为20,再次执行测试代码:
Chrome | Firefox | IE | |||
42.761 request json1.php. 42.761 request json1.php. 42.777 request json1.php. 42.778 request json1.php. 42.778 request json1.php. 42.779 request json1.php. 42.78 request json1.php. 42.78 request json1.php. 42.781 request json1.php. 42.781 request json1.php. 42.782 request json1.php. 42.783 request json1.php. 42.784 request json1.php. 42.785 request json1.php. 42.785 request json1.php. 42.786 request json1.php. 42.786 request json1.php. 42.787 request json1.php. 42.787 request json1.php. 42.788 request json1.php. 45.081 json1′s response. 45.085 json1′s response. 45.086 json1′s response. 45.086 json1′s response. 45.095 json1′s response. 45.11 json1′s response. 46.121 json1′s response. 46.153 json1′s response. 46.189 json1′s response. 46.2 json1′s response. 46.201 json1′s response. 46.242 json1′s response. 47.12 json1′s response. 47.166 json1′s response. 47.259 json1′s response. 47.271 json1′s response. 47.272 json1′s response. 47.272 json1′s response. 48.134 json1′s response. 48.183 json1′s response. | 25.411 request json1.php. 25.413 request json1.php. 25.415 request json1.php. 25.425 request json1.php. 25.431 request json1.php. 25.433 request json1.php. 25.435 request json1.php. 25.436 request json1.php. 25.446 request json1.php. 25.448 request json1.php. 25.45 request json1.php. 25.451 request json1.php. 25.453 request json1.php. 25.463 request json1.php. 25.465 request json1.php. 25.467 request json1.php. 25.469 request json1.php. 25.471 request json1.php. 25.475 request json1.php. 25.476 request json1.php. 26.506 json1′s response. 26.553 json1′s response. 26.559 json1′s response. 26.564 json1′s response. 26.569 json1′s response. 26.579 json1′s response. 27.525 json1′s response. 27.565 json1′s response. 27.57 json1′s response. 27.574 json1′s response. 27.578 json1′s response. 27.583 json1′s response. 28.528 json1′s response. 28.578 json1′s response. 28.584 json1′s response. 28.589 json1′s response. 28.595 json1′s response. 28.6 json1′s response. 29.547 json1′s response. 29.581 json1′s response. | 44.075 request json1.php. 44.076 request json1.php. 44.077 request json1.php. 44.078 request json1.php. 44.079 request json1.php. 44.079 request json1.php. 44.104 request json1.php. 44.137 request json1.php. 44.139 request json1.php. 44.152 request json1.php. 44.185 request json1.php. 44.186 request json1.php. 44.187 request json1.php. 44.209 request json1.php. 44.23 request json1.php. 44.25 request json1.php. 44.301 request json1.php. 44.41 request json1.php. 44.451 request json1.php. 44.452 request json1.php. 45.134 json1′s response. 45.15 json1′s response. 45.151 json1′s response. 45.152 json1′s response. 45.152 json1′s response. 45.182 json1′s response. 45.458 json1′s response. 45.473 json1′s response. 45.617 json1′s response. 45.623 json1′s response. 45.689 json1′s response. 45.737 json1′s response. 46.16 json1′s response. 46.161 json1′s response. 46.162 json1′s response. 46.196 json1′s response. 46.477 json1′s response. 46.486 json1′s response. 46.629 json1′s response. 46.63 json1′s response. | |||
0s 0s 0.016s 0.017s 0.017s 0.018s 0.019s 0.019s 0.02s 0.02s 0.021s 0.022s 0.023s 0.024s 0.024s 0.025s 0.025s 0.026s 0.026s 0.027s | 2.32s 2.324s 2.325s 2.325s 2.334s 2.349s 3.36s 3.392s 3.428s 3.439s 3.44s 3.481s 4.359 4.405 4.498 4.51s 4.511s 4.511s 5.373s 5.422s | 0s 0.002s 0.004s 0.014s 0.02s 0.022s 0.024s 0.025s 0.035s 0.037s 0.039s 0.04s 0.042s 0.052s 0.054s 0.056s 0.058s 0.06s 0.064s 0.065s | 1.095s 1.142s 1.147s 1.152s 1.157s 1.167s 2.113s 2.153s 2.158s 2.162s 2.166s 2.171s 3.116s 3.166s 3.172s 3.177s 3.183s 3.188s 4.135s 4.169s | 0s 0.001s 0.002s 0.003s 0.004s 0.004s 0.029s 0.062s 0.064s 0.077s 0.11s 0.111s 0.112s 0.134s 0.155s 0.175s 0.226s 0.335s 0.376s 0.377s | 1.059s 1.075s 1.076s 1.077s 1.077s 1.107s 1.383s 1.398s 1.542s 1.548s 1.614s 1.662s 2.085s 2.086s 2.087s 2.121s 2.402s 2.411s 2.554s 2.555s |
不过其然,上面的数据印证了我们的猜想,浏览器对同一协议的并发数量有限制,且Chrome和Firefox均为6,而IE则为12。然后,我再用Fiddler验证了这一结论。
Chrome:
IE:
测试“并发多个不同url的请求(参数不同,协议不同)”:
参数协议均不同的情况下,发现数据表现和仅参数不同的情况基本一致。所以,归纳为浏览器与同一服务器的连接数最大值有限制,即Chrome和Firefox为6,IE为12。然后,本人在Firefox的“about:config”页面下找到如下图的配置项(network.http.max-persistent-connections-per-server):
经测试,该配置项就是用于控制页面与同一服务器的最大连接数。
原文链接:
http://lison.sinaapp.com/?p=135
【转】关于“不同浏览器的并发异步请求”的简单研究