PHP性能问题
php 性能问题解决方向
php语言级性能优化
php周边问题性能优化
php语言自身分析、优化
压力测试工具
ab
apache提供的压力测试软件,安装apache自带压测
如何使用
./ab -n1000 -c100 http://www.baidu.com
-n请求数
-c并发数
-url目标压测地址
#ab -help
#ab -n1000 -c100 http://www.baidu.com
Request per request: 没秒接受请求数
Time per request:越小越好
php语言级性能优化
优化点:少写代码,多用php自身能力
性能问题:自身代码冗余较多,可读性不佳,并且性能低
为什么性能低?
php代码需要编译解析为底层语言,这一过程每次请求都会处理一次,开销大
好的方法:
多实用php内置变量、函数、常量
ab压测实战
公网服务器测试
ab -n100 -c10 http://ip地址/bad.php
php代码运行流程
.php -> Scanner->Exprs->Parser->Opcodes->Exec->Output
优化点:php内置函数的性能优劣
php内置函数 之间 依然存在快慢差异
建议:多了解php内置函数的时间复杂度
举例:
isset() array_key_exists()方法间的性能差异
优化点:尽可能少用魔法函数
php提供的魔法函数,性能不佳
为什么性能低?
为了给php省事
好的方法:
尽可能规避魔法函数
linux time 观察时间
#time php test_magic.php
举例:
测试魔法函数__get()性能
优化点:产生额外开销的错误抑制符@
描述:只是为了方便
@的实际逻辑:
在代码前,结束后,增加Opcode,忽略报错
vld -PHP Opcode 扩展
建议尽量不要使用@错误抑制符
优化点:合理使用内存
php有内存回收机制保底,小心使用内存
建议unset()及时释放不需要使用的内存(unset出现注销不掉的情况)
优化点:尽量少使用正则表达式
回溯开销较大
优化点: 避免在循环内做运算
循环内的计算将会被重复计算
优化点:减少计算密集型业务
php不适合密集型运算场景
php语言特性决定了php不适合做大数据量运算
适合衔接webserver与后端服务、UI呈现
优化点:务必使用带引号字符串做键值
php将会没有引号的键值当做常量,产生查找常量的开销
php周边都有什么?
Linux环境
文件存储
数据库
缓存
网络
减少文件类操作
常见php场景的开销次序:
读写磁盘、读写数据库、读写内存、读写网络数据
读写内存 << 读写数据库
优化网络请求
如何优化网络请求?
1、设置超时时间
链接超时
读超时
写超时