PHP7的变化

作者:有用网 阅读量:689 发布时间:2021-08-10
关键字 PHP

    PHP7 与 PHP5 版本相比有非常大的变化,尤其是在 Zend 引擎方 面。为提升性能,PHP7对Zend进行了深度优化,使得PHP的运行速度大 大提高,比PHP5.0~5.6快了近5倍,同时还降低了PHP对系统资源的占 用。下面介绍PHP7比较大的几个变化。

    1)抽象语法树

    在 PHP 之前的版本中,PHP 代码在语法解析阶段直接生成了 ZendVM 指令,也就是在zend_language_parser.y中直接生成opline指 令,这使得编译器与执行器耦合在一起。编译生成的指令供执行引擎 使用,该指令是在语法解析时直接生成的,假如要把执行引擎换成别 的,就需要修改语法解析规则;或者如果PHP的语法规则变了,但对应 的执行指令没有变化,那么也需要对修改语法解析规则。

     PHP7中增加了抽象语法树,首先是将PHP代码解析生成抽象语法 树,然后将抽象语法树编译为ZendVM指令。抽象语法树的加入使得PHP 的编译器与执行器很好地隔离开,编译器不需要关心指令的生成规 则,然后执行器根据自己的规则将抽象语法树编译为对应的指令,执 行器同样不需要关心该指令的语法规则是什么样子的。

     2)Native TLS 开发过PHP5.x版本扩展的读者对TSRM_CC、TSRM_DC这两个宏一定 不会陌生,它们是用于线程安全的。PHP中有很多变量需要在不同函数 间共享,多线程的环境下不能简单地通过全局变量来实现,为了适应 多线程的应用环境,PHP提供了一个线程安全资源管理器,将全局资源 进行了线程隔离,不同的线程之间互不干扰。

     使用全局资源需要先获取本线程的资源池,这个过程比较占用时 间,因此,PHP5.x通过参数传递的方式将本线程的资源池传递给其他 函数,避免重复查找。这种实现方式使得几乎所有的函数都需要加上 接收资源池的参数,也就是TSRM_DC宏所加的参数,然后调用其他函数 时再把这个参数传下去,不仅容易遗漏,而且这种方式极不优雅。

     PHP7中使用Native TLS(线程局部存储)来保存线程的资源池, 简单地讲就是通过__thread标识一个全局变量,这样这个全局变量就是线程独享的了,不同线程的修改不会相互影响。



#发表评论
提交评论