- php性能问题只占整个项目的30%~40%,优化的时候不仅仅考虑代码优化,还有周边问题的性能优化;比如数据库,apache,文件存储,缓存。
- PHP语言级性能优化:多使用PHP内置变量、常量、函数
- php代码的运行流程:php文件->zend引擎逐行扫描->zend引擎能识别的语法->解析->Opcodes(最终拿去执行机器代码) ->执行->输出
- php内置函数实现同样的功能,内置函数比较快,(opcodes比较少的比较快),现在php缓存都是缓存在opcodes,因为opcode缓存不需要再走扫描、理解、解析的环节
- PHP缓存多使用opcode缓存,可以减少编译解析,提高效率加快速度。
- 尽可能规避使用PHP魔法函数
- 错误抑制符@应该叫警告抑制符,他吸收不了错误。
错误抑制符原理:抑制代码执行前设置忽略一定等级警告,抑制代码执行后恢复原始设置。在开发中尽量少用@错误抑制符。可以使用try throw来抛出异常 - 合理使用内存,使用unset()及时释放不适用的内存
- 尽量少使用正则表达式,利用字符串处理函数,实现相同的逻辑(正则表达式的回溯开销较大,优化正则表达式需要技术活)
- 减少计算密集型业务(大批量的日志分析、大批量数据处理、处理大数据)
- 使用带引号字符串做键名,因为php会将没有引号的键名当做常量,产生查找常量的开销
- 减少文件类的操作,最好使用内存和数据库进行操作,而且尽量避免使用读写磁盘和网络数据请求,尤其是对于大文件的磁盘读写和速度慢的网络请求接口。(开销:读写内存<<读写数据库<读写磁盘<读写网络数据(socket),后三个基于文件系统,数据库有其缓存系统,网络又有延迟。)
- 优化网络请求,优化点,1:设置超时时间,2,将串行请求改为并行请求。(使用curlmulti*()函数,不过该函数的并行时间取决于最后一个返回的时间。)
- 使用Gzip 对PHP接口输出数据进行压缩 小于几十kb压缩效果不好 大于100k可以尝试。但弊端是解压时需要额外的开销。
- 对不经常修改但访问量大的页面或数据使用缓存。
- PHP性能瓶颈解决的其他方案:Opcode Cache,扩展实现,Runtime优化(HHVM)。
- php扩展网站:pecl.php.net php扩展网站
- 在linux中,使用命令:time php test.php 可以查看执行test.php耗时时间,主要关注user的时间。
压力测试工具:
- PHP性能分析工具,XHPorf,ab(压力测试),vld(opcode代码分析)。
- 使用php扩展vld可以查看Opcode。
命令php -dvld.active=1 -dvld.excute=0 test.php中active=1表明用vld扩展,execute-0只想查看Opcode,并不想执行。 - apache Benchmark(ab)是由Apache提供的压力测试软件,安装apache服务器时会自带该压测软件。
在linux下使用,输入命令:
./ab -n1000 -c100 目标地址(如http://www.baidu.com)
其中-n请求数 -c并发数
我们对于性能关注的值为:
Requests per second:优化越来越大;(表示每一秒钟处理的请求数变多)
Time per request:优化为越来越小(表示每一个请求处理的时间越来越少)
- xhporf,来自facebook的php性能分析工具,先做性能分析,再进行优化。php --ri xhprof,检查当前服务器扩展是否支持xhprof,如果输出xprof的版本,说明可以支持。xhprof_enable();开启xhprof,通过xhprof_disable()返回的性能数据,将性能数据保存在目录中。
注:该文章为观看“性能优化之php优化"课程后,大量参考学者们的笔记并加以整合的一篇文章,以供大家参考及补充。