PHP7的变化
Posted 略略略。。。。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP7的变化相关的知识,希望对你有一定的参考价值。
php7对zend进行了深度的优化,使得PHP7的运行速度大大的提高,比PHP5.0~5.6快了近5倍,同时还降低了php对系统资源的占用
下面说下PHP7比较大的几个变化:
1、抽象语法树:之前的版本,PHP代码在语法解析阶段直接生成了zendVM,使得编译器和执行器耦合在一起,导致修改任意一方都会引起另一方的修改,php7增加了抽象语法树,首先将php代码解析生成了抽象语法树,然后将抽象语法树编译为zendVM指令,抽象语法树的加入使得PHP的编译器和执行器很好的隔离开,编译器不要咬关心指令的生成规则,然后执行器根据自己的规则将抽象语法树编译为对应的指令,执行器同样不需要关心该指令的语法规则是什么演绎。
2、Native TLS:PHP提供了一个线程安全资源管理器,将全局资源进行了线程隔离,不同的线程之间互不干扰,使用全局资源需要先获取本线程的资源池,这个过程比较占用时间,实现方式使所有的的函数都需要加速接收资源池的参数,方式不优雅。PHP7中使用nvtive TLS(线程局部存储)来保存线程的资源池,简单的讲就是通过__thread标示一个全局变量,这样这个全局变量就是线程独享的了,不同线程的修改不会相互影响。
3、指定函数参数、返回值类型:
function foo(string $name): array{ return [];
}
这个函数的参数必须是字符串类型,返回值必须是数组类型,否则返回error错误
4、zval结构的变化:是PHP的内部结构,zval中有个比较重要的成员refcount_gc,它记录变量的引用计数,引用计数是PHP中实现变量自动回收的基础,也就是记录变量有多少个地方使用的一种机制,PHP5.x引用计数是在zval中而不是具体的value中,导致变量复制的时候需要复制两个结构,PHP7中将引用计数转移到了具体的value中,这样更合理因为zval其实就是变量名而value才是真正的值。除此之外,zval的结构大小也是从24byte减少到了16byte,这是PHP7能够降低系统资源占用的一个优化点所在。
5、异常处理:PHP5.x中很多操作会直接抛出error错误,PHP7将多数错误改成了异常抛出,这样一来就可以通过trycatch拿到,新的异常处理方式使错误处理更加可控。
6、hashtable的变化:哈希表也称为散列表。它是PHP中强大的array()类型的内部实现机构,也是内核中使用频繁的一个结构,hashtable结构的大小从72byte减少到了56byte,同时数组元素bucket的机构也从72byte减少到了32byte
7、执行器:在PHP7中不再采用传参数的方式,而是将execute_data、opline通过寄存器来进行存储,避免了传参导致的频繁出入栈操作,同时寄存器相比内存访问的速度更快,这个优化使得PHP的性能有了5%左右的提升。
8、新的参数解析方式
-------摘自《PHP内核剖析》
以上是关于PHP7的变化的主要内容,如果未能解决你的问题,请参考以下文章