PHP性能优化
2015.8.17
解决方向:
PHP语言级的性能优化
PHP周边问题的性能优化
PHP语言自身分析、优化(PHP底层 C层面上的)
PHP语言级性能优化
优化点:少些代码,多用PHP自身能力
性能问题:自写代码冗余较多,可读性不佳,并且性能低
原因:PHP代码需要编译解析为底层语言,每次请求都会处理,开销大
多使用PHP内置变量、函数、变量
php代码运行流程:
优化点:PHP内置函数的性能优劣
php内置函数之间依然存在快慢差异
多去了解PHP内置函数的时间复杂度
优化点:尽量少用魔法函数
PHP提供的魔法函数,性能不佳
尽可能规避使用PHP魔法函数(只是尽量,可以进行对比)
优化点:产生额外开销的错误抑制符@
@符号逻辑:在代码前、结束后,增加Opcode,忽略报错
优化点:合理使用内存
PHP有内存回收机制保底,但是也请小心使用内存
利用unset()及时释放不适用的内存(注:unset()出现注销不掉的情况)
优化点:尽量少的使用正则表达式
正则表达式的回溯开销较大,
利用字符串处理代码,实现相同逻辑
优化点:避免在循环计算式内做运算
循环内的计算式将会被重复计算
<?php
$str="hello word";
for($i=0;$i<strlen($str);$i++){
//do something
}
应该改为
<?php
$str="hello word";
$count=strlen($str);
for($i=0;$i<count;$i++){
//do something
}
优化点:减少计算密集型业务
PHP不适合密集型运算的场景
PHP语言特性决定了PHP不适合做大数量级的运算
PHP适合衔接WebServer与后端服务、UI呈现
优化点:务必使用带引号字符串做键值
PHP会将没有引号的键值当做常量,产生查找常量的开销
严格使用引号作为键值
<?php
$array=array(
"key"=>"ddd",
"imooc"=>"ddfdfdf"
);
echo $array[key]."\n";//PHP自带纠错功能
虽然$array["key"]和$array[key]的输出一样,但是$array["key"]性能更好
PHP周边问题的性能优化
优化运行环境
Linux运行环境
文件存储
数据库
缓存
减少文件类操作
常见PHP场景的开销次序:
读写磁盘、读写数据读写内存、读写网络数据
读写内存<<读写数据库<读写磁盘<读写网络数据
优化网络请求
问题:对方接口的不稳定因素、网络稳定性
方法:设置超时时间
1.连接超时 200ms
2.读超时 800ms
3.写超时 500ms
将串行请求并行化
1.使用curl_multi_*()
2.使用swoole扩展(最佳)
压缩PHP接口输出(压缩数据)
使用Gzip即可实现输出压缩
压缩输出的利弊:
利:利用我们的数据输出,Client端能更快获取数据
弊:压缩将参数额外的CPU开销
缓存重复计算内容
在多次请求。内容不变的情况可以使用内容缓存,使用缓存互用机制(就可以使用静态化)
重叠时间窗口思想
旁路方案
PHP性能瓶颈解决方法:
Opcode Cache:PHP扩展(APC、memcache等缓存扩展)
扩展实现:通过PHP扩展代替原PHP代码中高频逻辑
Runtime优化:HHVM等