PHP项目优化策略
前言
最近接了一个外卖平台的优化项目,项目莫名其妙卡顿,经常服务器CPU100%,严重影响客户体验,本人根据优化过程,略有收获,特此记录分享。
一、初次观察与应对方法
首先要观察,做到心中有谱,谋而后动,切记不可胡乱操作。
1、项目情况
- 每日访问人次
- 最大瞬时访问人次
- 是否存在频繁访问图片、大文件的情况
- 是否存在频繁需要大量计算的场景
通过以上数据计算,web服务器CPU、内存、储存空间、带宽的基础要求。
2、服务器
- 性能指标:CPU、内存、存储空间、Inodes 。特别是 Inodes ,Inodes满的话要及时删掉 linux inode已满解决方法
- 运行应用:nginx/apache、php、mysql、memcached/redis,使用
top
看看是否还有其他不常见的异常应用。如有异常进程,先度娘一下,其次可以考虑 a)kill -9 应用id
干掉应用进程,b) 建议 重新部署新服务器,然后移植代码的方式,来保证代码运行环境的干净。 - 端口情况:
netstat -nlpt
看看互联网端口开放情况,常见互联网端口:22、80、443;本地端口:3306、9000、11211。如有异常开放的端口,特别是互联网端口,找出来屏蔽掉,或通过防火墙直接k掉。Linux 基本防火墙设置和开放端口命令
3、web日志
- Nginx/Apache 网站日志:看看是否有大量非正常业务的访问量,可以 a)通过防火墙屏蔽IP/IP段,建议有条件的最好只开放某个区域(省份)IP段的访问;b)通过 Nginx/Apache的配置文件,禁止某些特定字符串的访问。
- PHP错误日志与慢日志:通过错误日志排查并修复代码问题;通过慢日志确定卡慢问题的原因
a)服务器算力不足,可通过 i)升级服务器配置;ii)优化计算代码 来解决此问题。
b)数据库算力不足,参考下条。 - Mysql 错误日志与慢日志:通过错误日志修复SQL指令的问题或数据表的异常。大部分慢日志都可以通过建立索引来解决。如果对项目有足够的了解,可以考虑重构业务数据表与索引,大数据量的表可通过分表、分区的方式来优化性能。 阿里云慢SQL优化挑战大赛分析 慢SQL优化非三言两语能解决,度娘上有很多优秀优化案例与教程,多看看。
二、持续观察持续优化
1、建立SQL执行指令记录库
- 区分前端与管理端的SQL指令
- 列出频繁请求数据的SQL指令,特别是频繁请求大量数据的SQL指令:频繁请求数据不变化的,用memcached缓存来解决;如果频繁请求变化的数据,可以考虑先储存在前端redis缓存中,然后通过其他机制同步缓存数据到数据库,前端客户直接读redis缓存中的数据即可。
- 列出频繁修改的数据表:可以采用水平分表形式,把频繁修改的字段,独立在1张表中;频繁变化的数据强烈建议放在前端redis缓存中处理,后面通过其他机制同步缓存数据到数据库。
- 列出数据容易造成堆积的数据表:可以采用分区(range分区)、分表(按年分表)形式来处理。
一般来说,资源要优先分配给前端频繁的业务指令;数据库应当仅仅是储存的功能,尽量避免把逻辑计算放在数据库上处理,要把逻辑计算放在本地服务器上。
2、建立访问控制机制
- 建立IP数据库:过滤非业务区域的访问量
- 建立访问日志:过滤频繁访问的请求,限制周期性访问的次数;过滤非业务时间的访问量。(有条件可使用硬件防火墙、软件防火墙)
三、其他优化
1、大量使用图片/大文件的场景
建议用七牛的OSS来储存图片/大文件,阿里云的OSS太贵了。
2、升级DNS解析套餐
由于不同运营商的问题,还有不同机器使用不同基带的问题,导致某些机器在解析域名的时间差别较大,可以通过升级DNS解析套餐来解决问题。特别是苹果机型,微信访问最大延迟可达10s以上。
3、升级带宽
带宽的配置建议是 正常业务带宽的2-3倍。
4、拆分前端/管理端
无论基于性能还是安全因素的考虑,强烈建议拆分前端/管理端的业务,应分别部署在不同服务器。