并发问题
当经过N天的努力,终于把网站写完来了。基本逻辑也测试通过了。PHPER终于可以松口气了。不过,真的就结束了吗? 且慢。 当网站上线后,你将遇到各种问题。并发问题,安全问题等等。 今天先说说并发问题。 因本人水平有限,写的东西有可能不全面,欢迎大家指导。
并发问题将体现在以下两个方面。 A. 网页显示慢。 B.各种逻辑错误。 好了,先分析第一个问题。 网页显示慢的问题。
1. 首先,在客户端检查。 下图是chrome浏览器,显示个元素加载时间。我们就可以耐心的检查哪个元素加载慢。按照以往经验一般是大图片暂用的时间比较多。图片一般越小越好。 笔者观察过,淘宝的图片一般不超过100k.压缩图片大小,是最直接有效的加速方式。
2. 减少第一次显示的图片个数。 通常会使用延迟加载的方法。具体方法为,通过ajax 显示后续的图片。
3. 前端缓存技术。
a. Nginx 可以设置jpg,js,css等文件永久缓存。
b. 也可以通过 header 设置cache.
4. Js,css文件的压缩合并。 总所周知,建立http链接的时间需要一段时间。而且每次下载一个js,css都需要建立一次http. 所以大家干脆将CSS与JS合并。减少建立TCP的时间。
5. 减少 ICON的文件数目。 在一个页面中ICON是不可避免的。 很早以前大家已经把所有的ICON放在一个文件中。 然后通过CSS的属性来取每个小ICON. 最近在学习bootstrap的时候, 又学习了一种矢量字ICON. 详见
http://v3.bootcss.com/components/。
前端的加速基本就这样。现在说一说服务器端如何加速。
1. 统计url的执行时间。 方法
在文件头加入$stime=microtime(true);
在文件结尾加入:
$etime=microtime(true);//获取程序执行结束的时间 $total=$etime-$stime; //计算差值 echo "<br />[页面执行时间:{$total} ]秒"; 查看是否有异常问题。
笔者在实际中就碰到一个问题,具体如下:
一元夺宝中,大家抢购的时候,需要查找IP对应的物理位置, 原先采用的方式是curl 函数系列提交IP到淘宝的一个server去获取地址。然后统一记入到数据库中,以便后面显示那个地区的人中奖了。
在单独测试的时候,没有问题。不过,大家枪购的时候,这个抢购页面经常timeout. 大家都怀疑是数据库的问题。 做了N多改进都没结论。后面我就一个函数一个函数的测试执行时间。花了2个小时,才找到这个根源。 如果大家,也使用到这个函数的时候,需要注意一下,timeout的设置。
2. 打开mysql slow log 。查看那条msyql语句执行慢。一般需要注意如下几点:
a. 是否增加了合适的索引。
b. Select的时候,紧紧选出需要的字段。
c. 不要在mysql中做随机取值,先取出来然PHP做随机。
d. 表态大了,做分表处理。纵向分表,横向分表。
e. 不使用事物的时候,MyISAM 也许会是一个更好的选择。
f. 引进nosql技术, 目前比较流行的是memcached 以及redis. 一般的作为读缓存。
3. 如果你是linux系统, top一下看php-fpm与Mysql的使用率吧。
a. 系统还有许多剩余cpu 使用率。 那么将php-fpm 进程数开大一点吧。 在php.ini有设置。
b. 如果系统还有需要内存空间,你可以将mysql的缓存开大一点。
c. 配置最优化了。 那么考虑一下PHP的静态网页技术。 如果你的网站实时性不需要特别强的情况下。
4. 升级硬件:
a. 负载均衡。
b. Mysql读写分离
c. 搭建nosql 矩阵池
好了,加速问题先说到这,后面有时间说说并发的逻辑混乱问题。