【PHP】web项目优化

        之前在公司接手了一个(专家+数据平台)的高考志愿填报分析系统的项目,主要是分析历年各个大学的招生数据,最后根据考生自己的分数情况在专家的引导下,制作出一份符合自己的高考志愿填表方案。

        由于客户以往都是使用excel做的高考志愿分析,所以所有数据结构,都是按照客户以前设计好的表格字段来对应设计数据库,部分添加方便系统搜索的字段,然后统一在后台导入,基本每张表格都是上万条数据。在高考成绩出来后,用户量会有几千或者上万,人数不多,但并发高,而服务器只有一台,所以分布式架构做不了,又由于在做高考志愿方案时,数据交互非常频繁,所以也无法做缓存。

        项目在线下做好的时候,打开志愿方案制作页面已经需要3~4秒,上线后,服务器买的2核4G的阿里云内存,6M的带宽,速度竟然慢到11~13秒,由于我的数据都是通过ajax获取,查看时间消耗在哪儿时发现,主要时间消耗是waiting(TTFB),也就是在后台获取数据的这个过程。

    以下是优化过程,给需要的朋友做个参考:

     1.  优化代码

       数据主要是各个大学的历年招生录取分数以及位次等,每一页展示100行,在后台通过left join在专业数据库、学校数据库以及志愿方案数据库里面获取数据,速度超级慢,然后到网上找了些相关的文章看,有篇文章说:当数据库数据量大的时候,用join还不如遍历去获取副表的数据,然后果断测试了一遍,还真是,速度直接提升了三倍,获取数据时间缩短为3~4秒。

    2.  优化数据库

        由于之前在设计数据库的时候只做了部分志愿方案表的字段索引,没考虑到做学校、专业信息表字段的索引,而代码里面常用学校、专业表里面的学校代码作为条件搜索或者联查,所以补充了这部分索引,速度立马提升到1~2秒。

        (关于mysql索引,可以参考文章:mysql索引总结

    3.  配置优化

        1~2秒的反应速度,对于高考填报志愿这珍贵的短短几天来说,太长了,因此还必须优化。测试网页速度,可以看到获取的数据量有些大,有十几k,所以尝试配开启PHP的压缩输出配置(zlib),同时开启服务器的gzip,再次测试,感恩,终于降到1秒以内了,平均速度在500ms。

终于搞定!


        因为自己做PHP也才两年,之前做的项目数据量都不大,对性能要求很低,所以一直在玩代码逻辑和各种API或者插件,做项目速度很快,但一提到项目优化,除了把代码排版得更漂亮一点,其他实质性的优化就做得很少,只是有需要的时候加个字段索引,结果真的遇到要优化的时候,发现脑袋里的那点货就不够用了。遇到性能问题,脑袋里第一个反应应该是想问题在哪里?找不到问题就如同一只乱窜的苍蝇,瞎弄一通,一点用也没有。

        这里也整理了一个基本思考问题的步骤:

        1.  排查代码里面的时间消耗,一步一步截取代码的查看执行时间;

        2.  一般会截取的数据库查询的位置发现代码执行时间陡然增大,这时候考虑如何进行sql优化。可以重新在某个函数内调试sql,并循环执行多次查看时间效率;

        3.  sql优化后,查看查询对应的数据表里面作为匹配条件的字段是否添加索引,没有就把索引添加上,一般小项目(十万数据以下)到这一步数据就优化得差不多了。

        4.  如果考虑到文件加载速度,同时也可以执行我优化的操作,开启PHP的zlib压缩输出配置,开启服务器的gzip配置(如果有图片的话,可能会失真)。

        5.  如果速度还是有点慢的话,这时候可以ping一下自己的网址,看一下速度,网址解析慢可以排查DNS解析,可以在配置数据库的时候没有用服务器IP,用了别名(如localhost)。或者再看一下自己服务器的CPU、内存、出站带宽等峰值是否飘高,如果都飘高了需要升级一下自己的服务器配置了。

       

        至于其他网站优化,可以参考阮一峰老师的教程:

                http://www.ruanyifeng.com/blog/2015/09/web-page-performance-in-depth.html

        还有web网站性能测试的网站里也有很多参考资料:

                http://www.51testing.com/


        总结到此,后续有其他经验再持续更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值