编者注】之前看过很多PHP性能分析的文章,但是都是一一写的。而且,这些规则没有上下文,没有上下文。进行了明确的实验来证明这些规则的优势,而讨论则集中在一些语法点上。本文换个角度分析PHP性能,通过实例分析PHP性能需要注意和改进的地方。对于PHP性能的分析,我们从两个层面出发,将这篇文章分为两部分,一是宏观层面,所谓宏观层面就是PHP语言本身和环境层面,二是应用层面,也就是在语法和用法规则层面,不仅讨论了规则,还辅助实例分析。在宏观层面,即PHP语言本身的性能分析分为三个方面:PHP作为一种解释型语言,有其天然的缺陷PHP作为一种动态类型语言,在性能上也有提升的空间目前主流的PHP版本本身具有语言引擎性能1.PHP作为一种解释型语言的性能分析与改进作为一种脚本语言,PHP同时也是一种解释型语言,这也是其天然性能有限的原因,因为它不同于将一种编译型语言编译成运行前的二进制代码。一种解释性语言在每次运行时,原始脚本都会被输入、解析、编译,然后执行。下面是PHP作为解释型语言的实现。如上图,从上图可以看出,每次运行都需要经过解析、编译、运行三个过程。优化点在哪里?可以想象,只要确定了代码文件,从解析到编译的步骤就都确定了,因为文件不再变化,输入的参数不同,执行也不同。在性能优化的世界里,最终的技巧是在获得相同结果的同时减少操作。这就是著名的缓存。缓存无处不在,缓存也是性能优化的杀手锏。于是OpCode缓存技巧出现了。只需要第一次解析和编译,在后续执行中,直接从脚本到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的输出。二、PHP作为动态类型语言的性能分析与改进第二个是PHP语言是动态类型语言。动态类型语言本身涉及内存中的类型推断。比如在PHP中,两个整数相加,我们可以得到整数值,一个整数和一个字符串相加,甚至两个字符串相加,就变成了整数相加。字符串和任何类型的连接操作都变成了字符串。f){中断;}}if(flag){数字[num]=i;数++;}}免费(数字);RETURN_LONG(num);}3、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启动的时候,所有的模块都需要加载一次。在特定的运行过程中,不需要再次加载和释放相关的模块资源。这样,提高了程序执行的效率。
