原创

PHP-总结-PHP性能优化

1、压力测试工具
Apache Benchmark (ab)
简介
abs是由Apache提供的压力测试软件,安装Apache服务器时会自带该压力测试软件
./ab -n1000 -c100 http://www.baidu.com/
-n请求数 -c并发数 (10次测试完成)

返回值:Request per second 和第二个 Time per request 可以参考
百度首页此值分别为101.65 和 9.838

2、PHP语言级性能优化
A:少些代码,多用PHP自身能力
问题:代码冗余、性能低(PHP代码需要编译器解析为底层语言,
这一过程每次请求都会处理一遍,开销大)
方案:多使用PHP内置变量、常量、函数

PHP代码运行流程
*.PHP ---> Scanner ---> Exprs ---> Parser ---> Opcodes ---> Exec ---> Output
PHP内置函数的性能优劣
内置函数之间也存在快慢差异
需要了解PHP内置函数的时间复杂度
比如isset() 与 array_key_exists()方法间的性能差异

B:尽可能少用魔法函数
PHP提供的魔法函数,性能不佳(为了给PHP程序员省事、PHP语言为你做了很多)
要尽可能避免使用PHP魔法函数
测试:time xxx.php
real 0m0.030s
user 0m0.024s
sys 0m0.007s

C:产生额外开销的错误抑制符
@的实际逻辑:在代码开始前、结束后,增加Opcode,忽略报错
尽可能不要使用@错误抑制符

D:合理使用内存
PHP有内存回收机制保底,但也要小心使用内存
建议:利用unset() 及时释放不使用的内存(注:unset()出现注销不掉的情况)

E:尽量少用正则表达式
正则表示的回溯开销较大
建议:利用字符串处理函数,实现相同逻辑

F:避免在循环内做运算
for(var i =0,len=data.length; i<len; i++){ //JavaScript写法

}

G:减少计算密集型业务
PHP不适合密集型运算的场景(语言特性)
PHP使用场景:衔接Webserver与后端服务、UI呈现

H:务必使用带引号的字符串做键值
PHP会将没有引导的键当作常量,产生查找常量的开销
建议:严格使用引号作为键值

I:减少文件类操作
常见PHP场景的开销次序
读写内存 << 读取数据库 < 读写磁盘 < 读写网络数据

J :优化网络请求
网络请求的坑
1> 对方接口不确定因素
2> 网络稳定性
优化:设置超时时间:连接时间、读超时、写超时
将串行请求并行化
a>使用curl_multi_*()
curl_muiti_add_handle
curl_multi_close
curl_multi_exec
curl_mutil_getcontent
curl_mutil_info_read
curl_mutil_init
curl_mutil_remove_handler
curl_mutil_select
curl_mutil_setopt
curl_mutil_strerror
b>使用swoole拓展

K:压缩PHP接口输出
使用Gzip
利:利用我们的数据输出,Client端能更快获取数据
弊:额外的CPU开销

L:缓存重复计算内容
什么情况下做出内容的缓存(多次请求、内容不变)
流程:Smarty开启caching
X.php ←—
↓↑ |
—→ Cache —→
| ↓ No Cache
← 计算、数据处理

M:重复时间窗口思想
串行
Process1 Process2 Process3 Process4
重叠时间窗口
Process1
Process2
Process3
Process4
旁路方案(图略,数据依赖不强烈时)

N:PHP性能问题的具体分析
工具:XHPorf (源自Fackbook的PHP性能分析工具)
时间:通过分析Wordpress程序(Linux终端环境)
grep ‘import_from_reader’ ./ -r (仅grep示例)
...
其他推荐工具
ab-压力测试
vId-opcode代码分析

O:PHP性能瓶颈解决方法:
Opcode Cache:PHP拓展APC
拓展实现:通过PHP拓展代替原PHP代码中高频逻辑
Runtime优化:HHVM

P:PHP性能问题解决方向
语言级性能优化 ---> PHP周边问题的性能优化 ---> PHP语言自身分析、优化
容易 ---> 困难

正文到此结束
本文目录