使用ab压力测试 or time php filename.php(查看user对应的时间)
少写代码, 多用PHP自身能力
性能问题:
自写代码冗余较多,可读性不佳,并且性能低
为什么性能低?
PHP代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。
好的方法:
多使用PHP内置变量、常量以及函数
PHP代码运行流程
要先扫描行数,然后交给zend引擎去理解代码再去产出Opcodes执行后输出
使用内置函数首先行数会少很多,内置的PHP函数就是zend的一些方法,所以zend在理解的时候速度也会快很多,函数少了产出的opcodes就会少,执行起来也会更快
现在很多php缓存都是缓存opcodes这样的话就节省了扫描和zend理解的步骤
PHP内置函数的性能优劣
情况描述:PHP内置函数之间依然存在快慢差异
好的建议:多去了解PHP内置函数的时间复杂度
举例:isset() 与array_key_exists()方法间的性能差异
尽可能少用魔法函数
情况描述:PHP提供的魔法函数性能不佳
为什么性能低:为了给PHP程序员省事,PHP语言为你做了很多
好的方法:尽可能规避使用PHP魔术函数
产生额外开销的错误抑制符@
情况描述:PHP提供的错误抑制符只是为了方便“懒人”
@的实际逻辑:在代码开始前、结束后增加Opcodes,忽略报错
可以用vld的扩展查看Opcodes
php -dvld.active=1 -dvld.execute=0 filname.php ---这句话表示我要查看Opcodes但是不执行
合理使用内存
情况描述:PHP有内存回收机制保底,但也请小心使用内存
好的建议:利用unset()及时释放不适用的内存(注:unset()出现注销不掉的情况“引用地址或长度小于256的时候待测试”)
memory_get_usage()这个函数可以参看内存使用情况
尽量少的使用正则表达式
情况描述:正则表达式的回溯开销较大,“没有金刚钻别揽瓷器活”
好的建议:利用字符串处理函数,实现相同的逻辑
避免在循环内做运算
情况描述:循环内的计算式将会被重复计算
代码示例:for ($i=0; $i<strlen($str); $i++){}虽然strlen()很高效但是计算多次仍然会增加很多开销
好的建议:可以$strlen = strlen($str); 把$strlen放在原来strlen()的位置
减少计算密集型业务
情况描述:PHP不适合密集型运算的场景
为什么: PHP语言特性决定了PHP不合适做大数据量运算,PHP是由C写的,在处理任何数据的时候都需要转换成C,所以效率不如C
PHP适合的场景:适合衔接webserver与后端服务、UI呈现
务必使用带引号字符串做键值
情况描述:PHP会将没有引号的键值当成常量,先去查常量,找不着的时候才去差数组的键,产生查找常量的开销
PHP周边问题的性能优化
PHP周边都有什么:服务器环境、磁盘、数据库、内存、网络
PHP周边对PHP程序的影响分析:
PHP脚本运行时间 ≈ 网络 + 数据库
比如现在PHP文件的运行时间为50ms,网络为150ms,数据库为500ms
那么我们就要抓大头先优化数据库再找网络最后优化PHP文件
减少文件类的操作
常见PHP场景的开销次序:读写磁盘、读写数据库、读写内存、读写网络数据
读写内存 << 读写数据库 < 读写磁盘 < 读写网络数据