相信很多人都听说过ZendEngine这个名词,也有很多人知道ZendEngine就是PHP语言的核心,但若要问一句:ZendEngine到底存在于何处?或者说,ZendEngine究竟是在什么时候怎么发挥作用让PHP源码输出我们想要的东西的?
Zend引擎是PHP实现的核心,提供了语言实现上的基础设施。
例如:PHP的语法实现,脚本的编译运行环境,扩展机制以及内存管理等,当然这里的PHP指的是官方的PHP实现(除了官方的实现,目前比较知名的有facebook的hiphop实现,不过到目前为止,PHP还没有一个标准的语言规范),而PHP则提供了请求处理和其他Web服务器的接口(SAPI)。
要理解ZendEngine的作用,就不能不理解为什么会出现,PHP为什么需要ZendEngine,ZendEngine的出现为PHP解决了什么问题。PHP发展到3.0版本的时候,此时PHP已经很普及了。“在PHP3的顶峰,Internet上10%的web服务器上都安装了它”,PHPManual如是说。
广泛的应用必然带来更高的要求。但此时的PHP3却有些力不从心了,这主要是因为PHP3采用的是边解释边执行的运行方式,运行效率很受其影响。其次,代码整体耦合度比较高,可扩展性也不够好,不利于应付各种各样需求。
因此,此时在PHP界里已经有点中流砥柱作用的ZeevSuraski和AndiGutmans决定重写代码以解决这两个问题。最终他们俩把该项技术的核心引擎命名为ZendEngine,Zend的意思即为Zeev+Andi。
ZendEngine最主要的特性就是把PHP的边解释边执行的运行方式改为先进行预编译(Compile),然后再执行(Execute)。这两者的分开给PHP带来了革命性的变化:执行效率大幅提高;由于实行了功能分离,降低了模块间耦合度,可扩展性也大大增强。
此时PHP已经能很方便的应付各种各样的BT需求了,而伴随PHP4.4.x―可能是PHP4系列的最后一个分支―的发布,PHP的大部分开发人员已经将注意力放在了PHP5或者PHP6上面,以后发布的基本上就是一些BugFixRelease。可以说第一代的ZendEngine是已经在站最后一班岗了。
年7月,PHP5发布,支持PHP5的是ZendEngine2.0版本。这个版本主要是对PHP的OO功能进行了改进(我没有提集成SQLite、PDO等特性是因为我们现在谈的主要是ZendEngine而非PHP)。
核心执行方式(非OO部分)较PHP4的1.0版本变动不大,所以PHP5纯粹的执行速度相对于PHP4没有大的提高。而预计将于本月中旬发布的PHP5.1版本则会携带ZendEngine2.1版本,这个版本将提供新的执行方式,执行速度也会快上许多,至少要比PHP5.0相对于PHP4.x的差别要大很多,所以,PHP5.1将会是一个很了很令人期待的版本。
但并非PHP5系列的ZendEngine2就完美无缺了。前面已经提到过,ZendEngine将代码分成编译和执行两大部分。一般情况下,我们的代码完成以后就很少再去改变了。但执行时PHP却不得不还得一次又一次的重复编译,这根本就是毫无必要的。而且通常情况下,编译的所花费的时间并不比执行少多少,说是五五开并不为过,因此这极大的浪费了机器的CPU。基于ZendEngine3.0的PHP6将试图解决这个问题。除此之外,目前的PHP对多字节的字符处理也是PHP的一大致命缺陷。这在人们联系日益国际化的今天几乎是不可忍受的。
而无数人在抨击PHP或比较ASP等同类语言时总是不可避免的要提到这一点。同时受到IBM方面的压力,PHP6也将会把对多字节字符的处理提到首要日程。这在PHP6的Dev版本中已经得到体现。目前PHP的实现和Zend引擎之间的关系非常紧密,甚至有些过于紧密了,例如很多PHP扩展都是使用的ZendAPI,而Zend正是PHP语言本身的实现,PHP只是使用Zend这个内核来构建PHP语言的,而PHP扩展大都使用ZendAPI,这就导致PHP的很多扩展和Zend引擎耦合在一起了,后来才有PHP核心开发者就提出将这种耦合解开的建议。
赞赏