这是在慕课网上《性能优化之php》记下来的笔记,防止遗忘。
一、语言级性能优化
1、优化点:少写代码,多用PHP自身能力
1)性能问题:自写代码冗余较多,可读性不佳,并且性能低
2)为甚么性能低:PHP代码需要编译解析成为底层语言,这一过程每次请求都会处理一边,开销大
3)好的方法:多使用PHP内置函数、变量、常量
例如array_merged,数组合并,先插入数组1,然后数组2插入,先判断元素是否存在,存在则忽略,否则插入
2、优化点:PHP内置函数的性能优劣
1)情况描述:PHP内置函数,之间依然存在快慢差异
2)好的建议:多去了解PHP内置函数的时间复杂度
3)isset()和array_key_exists()方法间的性能差异
3、优化点:尽可能少用魔法函数
1)情况描述:PHP提供的魔法函数,性能不佳
2)为什么性能低:为了给PHP程序员省事
3)好的方法:尽可能规避使用PHP魔法函数
4、优化点:产生额外开销的错误抑制符
1)情况描述:PHP提供的错误抑制符只是为了方便懒人
2)@的实际逻辑:在代码开始前、结束后,增加opcode,忽略报错;
vId-PHP Opcode查看扩展:显示Opcode的信息显示出来
5、优化点:合理使用内存
1)情况描述:PHP有内存回收机制保底,但也请小心使用内存
2)好的建议:利用unset()及时释放不使用的内存(注:unset()出现注销不掉的情况)
6、优化点:尽量少的使用正则表达式
1)情况描述:正则表达式的回溯开销较大
2)好的建议:利用字符串处理函数,实现相同逻辑
7、优化点:避免在循环内做运算
1)情况描述:循环内的计算式将会被重复计算
2)别在for中计算count
8、优化点:减少计算密集型业务
1)情况描述:PHP不适合密集型运算的场景
2)为什么?PHP语言特性决定了PHP不适合做大数据运算(底层语言为C)
3)适用场景:适合衔接WebServer与后端服务、UI呈现
9、优化点:务必使用带引号字符串做键值
1)情况描述:PHP会将没有引号的键值当做常值,产生查找常量的开销
2)好的建议:严格使用引号作为键值
二、周边性能优化
Linux环境、PHP、硬盘、数据库、内存(缓存基于内存)、网络
DB和PHP 运行环境可以忽略,很可能是网络耗时与数据库操作耗时
1、减少文件类操作
1)常见PHP常见的开销次序:读写磁盘、读写数据库、读写内存、读写网络数据
2)读写内存(因为PHP直接通过引擎读取内存)<<读写数据库(数据库基于本地磁盘,但一般会使用热内存,缓存在内存中,异步写入磁盘)<<读写磁盘<<读写网络数据(socket,网络延迟)
2、减少PHP发起请求
1)优化网络请求
坑:对方接口的不确定因素、网络稳定性
2)方法:
设置超时时间:a)连接超时——不超过200ms;b)读超时——不超过800ms,最多不能大于1s多;c)写超时——不超过500ms
将串行请求并行化:a)使用curl_multi_*(),注意当使用curl_multi_exec时,多个请求同时发起,但返回时间依赖于最长的那个请求时间,这是最简单但不是最好的;b)使用swoole扩展,推荐这个
3、压缩PHP输出的利与弊
1)如何压缩?
使用Gzip即可
2)利:利于数据输出,client端能更快获取数据
弊:压缩使服务端和客户端都额外的CPU开销(业务庞大的时候出现问题),当我们的数据小于几十K的时候,压缩效果不理想,若大于100K,则可以压缩会几十K
4、PHP缓存复用
1)什么情况下做输出内容的缓存:
多次请求,内容不变的情况
流程:X.php先查看cache,如果命中,则返回cache,否则进行计算、数据处理进入cache再返回
5、smarty调优和重叠时间窗口思想
1)Smarty开启caching
2)重叠时间窗口思想
三、PHP性能分析
1、工具XHProf(源自于Facebook的php性能分析工具)
1)php —ri xhprof检查扩展是否安装
xhprof_enable();
….
$data = xhprof_disable();//返回性能分析
include_once xhprof_lib.php;
include_once xhprof_runs.php;
$objXhprofRun = new XHProfRuns_Default();
$run_id = $objXhprofRun->save_run($data,”test”);
var_dump($run_id);
xhp,可以查看性能数据
Incl. Wall Time表示我以及我之后的所有方法的耗时
Excl Wall Time表示我的耗时
ctrl+u查看源代码
其他推荐工具
ab——压力测试
vId——opcode代码分析
四、PHP性能瓶颈解决方法
1、opcode cache:PHP扩展APC
2、pecl.php.net
3、扩展实现:通过PHP扩展代替原PHP代码中高频逻辑
4、runtime优化:HHVM(后来发力不足)