Web 技术研究所

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

各浏览器对GET方法的处理差异

  废话就不多说了,直接切入正题。我们用一个代码来测试这个问题。 //设置脚本无超时
set_time_limit(0);
//定义一个文件名,后面会用到
$f='temp';
//生成一个随机文件
touch(mt_rand());
//判断temp这个文件是否存在
if(file_exists($f)){
  //存在则读取它的修改日期
  echo filemtime($f);
}else{
  //不存在则创建
  touch($f);
  //创建完成后程序陷入死循环
  while(1)sleep(1);
};
  这个程序每次运行都会生成一个随机文件,只要观察这个文件生成的数量就可以知道程序被运行了几次。这个程序第一次被运行的时候由于temp这个文件不存在,因此它会执行else部分,创建这个文件并陷入死循环。从浏览器上看来就是这个页面打开的时候一直在加载中。当这个程序第二次运行的时候,由于第一次已经生成了temp这个文件,所以它会把文件的修改时间输出到客户端。这就意味着第二次运行时,浏览器上的页面是可以正常打开的,而且会收到一串数字,这个数字就是temp的创建时间。
  从理论上来分析是这样的没错,但是为什么不试试呢?首先是Chrome,我们在Chrome中开两个选项卡,分别访问这个程序。

  第一个选项卡访问时,页面陷入无尽的加载状态。文件生成一个temp和一个随机文件。第二个选项卡访问时,页面也是无尽的加载状态,而且没有生成随机文件,这就说明第二个选项卡没有把请求发送到服务器上。这时候,当我们关闭掉第一个选项卡时,第二个选项卡就加载成功,并返回了它该返回的数据,随机文件也在这时候生成。

  这就可以理解为:在Chrome中,多个请求同时GET一个URL时,他们被放入一个同步队列中,只有队列前面的请求断开后,后面的请求才会发起。不仅是Chrome,在火狐下测试也可以得到同样的结果,我就不贴测试截图了。但其其它浏览器就不同的,下面来测试下Opera。

  同时打开两个选项卡时得到和Chrome中相同的结果。

  但是关掉第一个选项卡之后,第二个选显卡依然在加载状态,而且随机文件也没有生成,说明服务器程序没有被访问到。那么这第二个选项卡是在哪个步骤上卡住了呢?我们需要修改一下测试代码 //把前面代码的else中的部分改成这样
  touch($f);
  ob_end_clean();//如果没有开启ob这个步骤可以省略
  header('Content-Type:text/html;');
  while(1){//每秒向客户端发送一个随机数
    echo '<div>'.mt_rand().'</div>';
    flush();
    sleep(1);
  };
  现在开两个Opera同时访问这个程序。

  这是个非常诧异的结果,随机文件只生产了一个。这就说明程序只被运行了一次,而两个页面上都能显示内容,而且它们的内容是完全相同的。这就只有一种解释,那就是在Opera上对同一个URL发送多个GET请求时,他们会使用同一个Socket共享数据,而不会另外发送请求。这就和Chrome的处理方式完全不同,接下来我们再测试个IE。

  IE就没其它浏览器那么刁钻,同时用两个选项卡访问这个程序,第一个选项卡访问的程序由于没找到temp文件所以陷入死循环。第二个选项卡再访问是找到了temp文件正常访问。这就和我们最初的理论测试是一样的结果。
  总之,要明白的是,浏览器处理GET请求的方式是不同的。如果使用Ajax并发的获取数据,那么使用GET方法就需要从长计议了。而POST就没有这个问题,所以在Ajax中选择POST还是GET要考虑的绝不仅仅是参数的问题。
网名:
54.162.218.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^