编程爱好者之家

php7的新特性

2018-04-07 16:39:16 356

1)抽象语法树

     之前的php版本、php代码在语法解析阶段直接生成了zendvm指令、也就是在zend_language_parser.y中直接生成opline指令、使得编译器和执行器耦合在一起

     php7是先生成抽象语法树、然后将抽象语法树编译成ZendVM指令,使得php的编译和执行隔离开

  2)Native TLS

     在5的版本中、有一些变量是需要在不同函数间共享的、而在多线程的情况下、不能通过简单的全局变量来实现,为此php提供了一个线程安全资源管理器、将全局资源进行线程隔离,在使用全局资源时、先要获取本线程的资源池,这个过程是比较耗时的,php5通过线程传递的方式将本线程的资源池传递给其它函数、避免重复查找,这样几乎所有的函数都得加上接收资源池的参数、即TSRM_DC宏所加的参数、然后调用其它函数时把这个参数传递下去、容易泄漏,且不太优雅

    php7使用Native TLS(线程局部存储)来保存线程的资源池,就是通过__thread来保存一个全局变量、这样,这个变量就是线程共享的了、不同线程的修改不会相互影响

  3)指定函数参数、返回值类型

     php7新增特性

  4)zval结构体的变化

     struct _zval_struct{}

     typedef union _zvalue_value{}

     php7将计数器 refcount__gc 放到了val中、

  5)异常处理

     一些php5中直接抛出fatal error的错误、php7改为了异常抛出、继承throwable可以得到

  6)hashtable的变化

     hashtable即哈希表、也称为散列表、是php数组的内部实现结构,也是php内核中使用很频繁的一个结构、函数符号表、类符号表、常量符号表都是通过hashtable实现的

     php7的hashtable从72byte减小到了32byte、数组元素bucket结构也从72byte减小到了32byte

  7)执行器

     execute_data、opline采用寄存器变量存储、执行器的调度函数为:execute_ex、这个函数负责执行php代码编译生成的zendVM指令、在执行期间会频繁的调用execute_data、opline两个变量,5的版本、这两个变量是通过参数传递给各指令handler的,7中使用寄存器存储、避免了参数出栈入栈的操作,同时寄存器相对于内存的访问更快,这个优化使php的性能提升了5%

  8)新的参数解析方式:

     php7在保留原参数解析方式zend_parse_parameters()的同时提供了另外一种高效的参数解析方式


同类文章