从原理分析PHP性能

240 阅读4分钟

从原理分析PHP的性能,主要从以下几个方面:内存管理、变量、函数、运行机制、网络模型来进行分析。 

1.内存管理 

类似Nginx的内存管理方式,PHP在内部也是基于内存池,并且引入内存池的生命周期概念。在内存池方面,PHP对PHP脚本和扩展的所有内存相关操作都进行了托管。对大内存和小内存的管理采用了不同的实现方式和优化。在内存分配和回收的生命周期内,PHP采用一次初始化申请+动态扩容+内存标识回收机制,并且在每次请求结束后直接对内存池进行重新mask。 

2.变量 

总所周知,PHP是一种弱变量类型的语言,所以在PHP内部,所有的PHP变量都对应成一种类型Zval,其中具体定义如下: 

在变量方面,PHP做了大量的优化工作,比如说Reference counting和copy on writer机制。这样能够保证内存使用上的优化,并且减少内存拷贝次数。在数组方面,PHP内部采用高效的hashtable来实现。 

3.函数 

在PHP内部,所有的PHP函数都回转化成内部的一个函数指针。比如说扩展中函数

ZEND_FUNCTION ( my_function );//类似function my_function(){} 

在内部展开后就会是一个函数 

void zif_my_function ( INTERNAL_FUNCTION_PARAMETERS ); 

void zif_my_function( 

int ht, 

zval * return_value, 

zval * this_ptr, 

int return_value_used, 

zend_executor_globals * executor_globals

 ); 

从这个角度来看,PHP函数在内部也是对应一个函数指针。

4.运行机制 

在话说PHP性能的时候,很多人都会说“C/C++是编译型,JAVA是半编译型,PHP是解释型”。也就是说PHP是先动态解析再代码运行的,所以从这个角度来看,PHP性能必然很差。

的确,从PHP脚本运行来输出,的确是一个动态解析再代码运行的过程。 

PHP的运行阶段也分成三个阶段:

● Parse。语法分析阶段。 
● Compile。编译产出opcode中间码。 
● Execute。运行,动态运行进行输出。 

5.动态运行 

从上面的几个分析来看,PHP在内存管理、变量、函数、运行机制等几个方面都做了大量的工作,所以从原理来看,PHP不应该存在性能问题,性能至少也应该和JAVA比较接近。 

但为什么还有很多人感觉PHP慢呢?尤其是一些计算量的性能对比上,总发现PHP处理的性能相对比较低效。这个时候就不得不谈PHP动态语言的特性所带来的性能问题了,由于PHP是动态运行时,所以所有的变量、函数、对象调用、作用域实现等等都是在执行阶段中才确定的。这个从根本上决定了PHP性能中很难改变的一些东西:在C/C++等能够在静态编译阶段确定的变量、函数,在PHP中需要在动态运行中确定,也就决定了PHP中间码不能直接运行而需要运行在Zend Engine上。   

6.网络模型 

目前采用PHP的方式,比较理想和通用的模式是采用fastcgi(PHP-FPM)。Php-fpm在网络模型上比较类似nginx,采用了多进程Master+多worker的模式。Php-fpm本身是基于libevent中的epoll模型。从网络模型来看,该方式也不会和其他网络模型存在性能差异。

7.结论 

从上面分析来看,在基础的内存管理、变量、函数、运行机制、网络模型方面,PHP本身并不会存在明显的性能差异,但由于PHP的动态运行特性,决定了PHP和其他的编译型语言相比,所有的变量查找、函数运行等等都会多一些hash查找的CPU开销和额外的内存开销,至于这种开销具体有多大,可以通过后续的基准性能和对比分析得出。

因此,也可以大体看出PHP不太适合的一些场景:大量计算性任务、大数据量的运算、内存要求很严格的应用场景。如果要实现这些功能,也建议通过扩展的方式实现,然后再提供钩子函数给PHP调用。这样可以减低内部计算的变量、函数等系列开销。

点关注,不迷路 

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以点这里shimo.im/docs/rjJttd… 《进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】》