PHP优化——从语言到业务
经常有人说php速度慢,其实语言层面的速度差异和实际的业务相比,不在一个数量级。
业务的瓶颈往往在于io,而不是CPU。
0x0 语言
语法
- 单引号和双引号 单引号不解析字符串里的变量,而双引号会解析,如果需要大量处理字符串,建议用单引号和字符串连接符"."
- === 和 == ""会进行类型转换,比如"1"和1 ,用""为真,而"="为假,如果类型相同的话,使用""。
- 合理使用静态变量,如保存函数中只需要初始化一次的数据
- 局部变量优于全局变量
- 输出缓存控制 ob_xxx系列函数
- php7 针对项目单独优化 可参看鸟哥的文章
- 使用php7 增加变量的参数类型,减少类型转换
- 合理使用多线程和协程
- 更多语法上的优化可以看这篇文章
php.ini配置
网上有很多,可以参加这篇文章
第三方服务
利用第三方服务,可以把php不擅长的委托出去
- gearman 分布式任务队列,教程
- beanstalk 消息队列,教程
- redis 缓存
消息队列和任务队列,常用在比较耗时的任务,比如批量导出订单数据为excel时,web服务直接可以把这个消息
放到消息队列里,在后台跑一个脚本,取出消息后,查询数据库导出订单。至于后台使用什么语言,则无所谓了。
这两个队列有些相似之处,基本上使用消息队列就足够了。任务队列在编码上要稍微复杂点,要按照任务协议,实现worker。
消息队列只需要subscribe这个队列,有消息来了,取出消息,然后处理就行。
框架
可以选择简洁的框架,减少框架内部的消耗,如slim,phalocn,yaf
字节码缓存
opcache、apc等
扩展
使用扩展,如把cpu密集型的改用C/C++开发扩展,可以使用PHP-CPP,或者PHP-X
辅助开发。
0x1环境
0x2 算法
- 递归算法改为非递归
- 先排序再查找
- 用哈希代替数组,如判断某个字符串在数组里是否存在,可以把数组改造为哈希,这样只需要判断哈希里key是否存在即可
- 使用php内置的array_xxx,系列函数,搭配回调函数,解决数组过滤、查询、去重等
- 利用redis的集合,如判断两组数据中重复的数据,求两组数据中的差异
0x3 业务
通过跑测试来判断瓶颈所在,再分别优化
io密集型
增大内存
- 文件io
memcache 缓存文件、异步读取 - 网络io
- 压缩 之前做游戏时,内网测试单台机器可以支撑1000多人同时在线,然而正式环境才只能支撑200多人。
测试同学反馈是网络带宽不够,于是在服务端和客户端都做了gzip压缩,数据量减少到1/6,解决了外网问题。 - 尝试更紧凑的结构如,xml替换为json,json替换为msgpack等
- 压缩 之前做游戏时,内网测试单台机器可以支撑1000多人同时在线,然而正式环境才只能支撑200多人。
- 数据库io
- 使用缓存
- 浏览器 在http头中添加etag和cache控制缓存时间
- cdn
- redis
- 服务端渲染
cpu密集型
把相关代码用C/C++改写为扩展
安装监控软件
如oneapm,听云、博瑞等,或者开源的Tideways
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。