Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

浏览器对同域名页面的连接数限制

  普通的网站都是采用普通的HTTP连接,因此不会遇到这个问题。但是对于一些Web应用或现代化的网站而言,使用HTTP的长连接的做法已经司空见惯了。但是有个很关键的问题,浏览器分配给一个域名的连接数是有上限的,而且这个限制是跨页面的。
  对于浏览器对GET方法的处理差异我在之前的文章中已经介绍过了。GET方法有很多问题,所以这里所有的测试都使用POST方法。为了测试POST方法的长连接,使用下面这个程序(test.html)。
//向test.php发起一个异步POST请求,测试用的代码而已,不要吐槽with
with(new XMLHttpRequest)open("POST","test.php",true),send();
  为了让它是长连接,我们还需要编写特定的程序(test.php)来测试。 //关闭脚本超时限制
set_time_limit(0);
//使用死循环来让页面永远不加载完成
while(1){
  //为了避免浏览器断开后脚本永远运行下去需要一个心跳包
  echo ' ';
  flush(); //如果环境用开启OB需要先调用ob_flush
  //挂起一秒,以防止占用太多CPU
  sleep(1);
};
  另外,由于这个问题是和域名有关的,于是我在hosts把“localhost1.web-tinker.com”和“localhost2.web-tinker.com”这两个域名解析到了本机上 #这个是hosts文件的内容
127.0.0.1 localhost1.web-tinker.com
127.0.0.1 localhost2.web-tinker.com
  使用同一个域名不断的打开test.html,在打开前6个时很顺利,但是打开第7个时就有问题了。这时根据环境的不同会有两种情况,一种是页面有缓存,因此GET请求的页面不会重复发起,但是test.html中的POST请求将发送不出去。另一种情况是环境没对页面缓存,这时候连test.thml这个页面程序本身都加载不下来,这个GET请求会陷入等待状态。如果关掉之前打开的6个页面中的其中一个,那么这个页面就可以顺利加载,并且POST请求也能正常工作,但是再打开一个页面就又会遇上这个问题,总之就是连接的数量无法超过6个。然后试着使用另一个子域名来打开这个页面就会发现可以正常打开,而且POST请求也可以正常工作。但是一旦到了第7个就再次出现和之前一样的情况。

  产生这个问题的原因就是Chrome27对一个域名设置了6个连接数上限。Firefox22和Chrome27一样是限制了6个连接数,但是IE就没有做这个连接数的限制。在IE中只要服务器允许,开多少个都行。
  我觉得这个限制很不合理,既然程序是页面独立就不应该跨页面做这样的限制。如果非要做这个限制,至少浏览器应该提供一套同域跨页面工作的API吧?
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^