最近一直在做一个新的线上业务项目,在所有的前期设计,中期的编写以及后期的上线完成之后,开放给用户使用的时候,发现网站的速度没有自己想象中的那么快!于是在经过大量的调研以及调试之后,终于速度上达到了我们的预期。
下面是我这一个多月收集来的一些信息以及自己的一些思考,再次做些记录。
一. 从浏览器向服务器发起请求来说开:
(1).刚开始出现的问题:
刚开始遇到这个速度慢的问题的时候,我在想是不是应该压缩js或者css的一些代码,或者说是加一些内存,加点cache之类的,甚至想到了是不是应该多加点带
宽,反正是一切能提高性能的都应该去做一遍,最终是眉毛胡子一把抓,没有抓到最根本最核心的问题是啥,导致问题解决起来不是那么的容易。
应该考虑的思路:
其实首先应该从浏览器向服务器发起请求这个整个的流程来分析瓶颈,首先需要了解下http请求的过程:
根据http协议,任何一次http请求它的处理过程如下:(ps: 这段是转载的一段)
1、浏览器向服务器发出请求。此时浏览器一般左下角会显示:正在请求...
2、服务器接到请求后调用应用程序(php,java等,根据后缀名确定)执行。服务器接到请求后会马上返回一个头信息给浏览器,此时一般浏览器左下角会显示:已经连接
到服务器(服务器接到请求)
ps:如果速度很快,浏览器左下角这些信息是一闪而过的。如果网络出现延迟,这些信息会一直显示在左下角位置。
3、php,java等代码执行完毕
4、代码执行完毕后,服务器会发一个http头响应浏览器(也就是告诉浏览器你开始接收数据了,准备好吧)。
此阶段浏览器在没有接到这个头信息之前,左下角会显示:正在等待服务器响应...
5、浏览器接到服务器发给响应头,开始接收了数据,浏览器处于接收数据状态,
我们会看到浏览器左下角会显示:正在传输数据....。也就是这个状态。
6、传输数据结束,完成一次http处理,整个过程http处理结束。
浏览器归纳左下角的状态依次为:正在请求》》已连接到服务器》》等待响应》》服务器已响应》》正在传输数据》》开始渲染数据
其实我们可以从这六个阶段分析出来,到底是那块比较慢,大体来说:
第一个阶段: 正在请求,这个阶段如果慢的话,可能考虑是不是带宽的原因,是不是服务器机房不在国内导致的,比如中国到美国的光缆就是通过大西洋的海底光缆进
行通信的
第二个阶段:已经连接到服务器,说明此时的服务器(apache或nginx)已经开始调用相关的php或者java的模块进行处理了,此处应该没有性能的影响!
第三个阶段:等待响应,此时如果速度过慢的话,就应该引起重视了,可能是自己的程序上写的有问题,需要对相应的代码块进行基准测试,具体的最简单的方法就是
使用microtime_float这个函数,来
进行测试(ps :此函数的基本用法在php的手册上都有),在代码刚开始的时候,放上一个时间,结束的时候放上一个时间,然后两次时间相减就是耗费的时间,具体的
代码如下:
1 $begin_time = microtime_float();//执行开始记录时间戳,精确到毫秒 2 3 /*中间要执行的代码*/ 4 5 end_time = microtime_float(); 6 7 $exec_time = $end_time-$begin_time;//执行时间计算 8 9 @save_stat($exec_time);//把执行时间写入到文本文件中 10 11 12 /*下面是定义的两个函数*/ 13 function save_stat($time) 14 { 15 static $call_count=1;//统计调用多少次 16 $call_limit = 10;//遇到并发问题的时候限制尝试多少次 17 if(!$time) return ; 18 $exec_stat_file = "./exec_stat_file.txt"; $fp = fopen($exec_stat_file,'ab'); 19 if(flock($fp,LOCK_EX)) 20 { 21 $s = 'access:'.date("Y-m-d H:i:s").',execute time:'.$time.'s,request_url:http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."||".PHP_EOL; 22 fwrite($fp,$s); 23 flock($fp,LOCK_UN); 24 }else{ 25 usleep(1000); 26 if($call_count<$call_limit) 27 { 28 $call_count++; 29 save_stat($time); 30 } 31 } 32 33 @fcolse($fp); 34 //var_dump($fp); 35 36 } 37 38 function microtime_float() 39 { 40 list($usec, $sec) = explode(" ", microtime()); 41 return ((float)$usec + (float)$sec); 42 }