当前位置: 首页 > 科技观察

PHP性能分析与实验——性能的宏观分析

时间:2023-03-13 12:03:21 科技观察

【编者按】之前看过很多PHP性能分析的文章,但是都是一一写的。而且,这些规则没有上下文,也没有明确的实验表明这些规则的优点,讨论集中在一些语法点上。本文换个角度分析PHP性能,通过实例分析PHP性能需要注意和改进的地方。对于PHP性能的分析,我们从两个层面出发,将这篇文章分为两部分,一是宏观层面,所谓宏观层面就是PHP语言本身和环境层面,二是应用层面,也就是在语法和用法规则层面,不仅讨论了规则,还辅助实例分析。在宏观层面,即对PHP语言本身的性能分析分为三个方面:作为解释型语言,PHP有其天然的缺陷。PHP作为一种动态类型语言,在性能上也有提升的空间。目前主流的PHP版本本身就具有语言引擎性能。一、PHP作为一种解释型语言的性能分析与改进作为一种脚本语言,PHP同时也是一种解释型语言,这也是其天然性能有限的原因,因为它不同于将编译型语言编译成二进制代码再运行。一种解释性语言在每次运行时,原始脚本都会被输入、解析、编译,然后执行。下面是PHP作为解释型语言的实现。如上图,从上图可以看出,每次运行都需要经过解析、编译、运行三个过程。优化点在哪里?可以想象,只要确定了代码文件,从解析到编译的步骤就都确定了,因为文件不再变化,输入的参数不同,执行也不同。在性能优化的世界里,最终的技巧是在获得相同结果的同时减少操作。这就是著名的缓存。缓存无处不在,缓存也是性能优化的杀手锏。于是OpCodecachetrick就出现了,只需要第一次解析编译,在后续的执行中直接从脚本到Opcode,从而达到性能提速的目的。执行过程如下图所示:与每次解析编译相比,读取脚本后,直接从缓存中读取字节码的效率会大大提高。改善了多少?让我们做一个没有Opcode缓存的实验。20个并发,一共10000个没有opcode缓存的请求,得到如下结果:其次,我们在服务器上开启opcode缓存。要实现操作码缓存,您只需要安装APC、ZendOPCache和eAccelerator扩展。即使您安装了多个,也只会启用其中一个。注意修改php.ini配置后需要重新加载php-fpm的配置。这里启用了APC和ZendOPCache进行实验。支持APC的版本。可以看出速度有了很大的提升。本来每个请求110ms,每秒处理182个请求。开启APC后为68ms,每秒处理294个请求,提升近40%。在启用ZendOpcache的版本中,获得了与APC大致相同的结果。每秒处理291个请求,每个请求耗时68.5ms。从上面的实验可以看出,测试页面有超过40ms的时间花在了语法解析和编译上。通过缓存这两个操作,可以大大提高这个过程的速度。这里补充一点,OpCode到底是什么,OpCode编译的字节码,我们可以使用bytekit之类的工具,或者使用vldPHP扩展来编译PHP代码。下面是vld插件解析代码的运行结果。可以看到每一行代码都被编译成了对应的OpCode的输出。#p#2。PHP作为一门动态类型语言的性能分析与改进二是PHP语言是一门动态类型语言。动态类型语言本身涉及内存中的类型推断。相加,我们可以得到整数值,一个整数和一个字符串相加,甚至两个字符串相加,就变成了整数相加。字符串和任何类型的连接操作都变成了字符串。f){break;}}if(flag){numbers[num]=i;num++;}}free(numbers);RETURN_LONG(num);}#p#三、PHP语言本身的底层性能引擎提升第三层性能优化是语言本身的性能提升,这不是我们普通开发者能做到的。在PHP7之前,我们希望在小版本中进行改进,但改进并不十分显着。比如PHP5.3、PHP5.4、PHP5.5、PHP5.5的性能对比,对于同一段代码,PHP5.5都有一定程度的提升。上面的例子中已经提到了PHP5.3的版本,大概需要33s。现在让我们看看其他PHP版本。运行如下:PHP5.4版本,相比5.3版本有了一定的改进。大约快了6秒。PHP5.5版本是在PHP5.4的基础上更进一步,6S速度更快。PHP5.6有点倒退。PHP7确实在效率上有了惊人的提升,是PHP5.3的3倍多。以上就是各个PHP版本之间素数脚本运行速度的差异。虽然只测试了这个程序,不是特别严谨,但是在同一台机器上,编译参数基本一致,还是有一定区别的。可比。在宏观层面,除了上述之外,在实际部署过程中,对PHP性能的优化还体现在减少运行过程中消耗的资源上。所以FastCGI模式和mod_php模式比传统的CGI模式更受欢迎。因为在传统的CGI模式下,每次运行脚本都需要加载所有的模块。程序运行结束后,模块资源也应该被释放。如下图所示:在FastCGI和mod_php模式下,不需要。只有在php-fpm或者Apache启动的时候,所有的模块都需要加载一次。在特定的运行过程中,不需要再次加载和释放相关的模块资源。这样,提高了程序执行的效率。以上就是PHP宏观层面的性能优化分析。在本文的第二部分,我们将讨论应用程序的PHP优化指南。敬请关注!本文由OneAPM工程师整理整理。OneAPM是应用性能管理领域的新兴领导者,可以帮助企业用户和开发者轻松实现:实时捕获慢速程序代码和SQL语句。阅读更多技术文章,请访问OneAPM官方博客。