PHP 学习笔记之 Zend Engine 简介
时间:2010-08-22 来源:skyaspnet
首先说明咱本人一不是 PHP 官方开发社区成员,二没有 Zend 公司背景,所有的一切都是查看源码、Google 搜索和个人臆断瞎猜而来,同时对 Zend Engine 也是在边研究边学习阶段,都是些个人理解,也肯定有会有各种各样的 BT 错误。因此若各位朋友觉得有疑问那就尽管怀疑,欢迎扔砖,咱们互相切磋,互相学习,共同提高。三则,既然是个人感悟,那字里行间也难免会夹杂众多甚至是相当偏激的看法。您若觉得这些看法不可理喻,这些文字无法接受,文风不符合您的口味,那么我的建议就是:不喜勿入。
上面是不着边际的废话,下面开始说一些略着边际的废话。
相信很多人都听说过 Zend Engine 这个名词,也有很多人知道 Zend Engine 就是 PHP 语言的核心,但若要问一句:Zend Engine 到底存在于何处?或者说,Zend Engine 究竟是在什么时候怎么发挥作用让 PHP 源码输出我们想要的东西的?这恐怕答出的人就不多了。当然,这也是这系列文章所要回答的问题(读者云:这不是废话么。你不写那我们还看这篇文章干嘛? )。
若要理解 Zend Engine 的作用,就不能不理解为什么会出现,PHP 为什么需要 Zend Engine, Zend Engine 的出现为 PHP 解决了什么问题。切~,我发现我似乎又落入了一个俗套:写某项技术的文章必须把该技术可上推到祖宗八代而且都可以Google 到的历史再不厌其烦的说了一遍又一遍仿佛不如此就不能显得自己对这项技术有多么地了解就不能显示自己的话语在这项技术上的有多么的权威性一般。没办法,我自己也有一些虚荣心,更何况我还有“若不这样写读者就会觉得文章显得很突兀,仿佛技术是突然冒出的”这样冠冕堂皇的理由来搪塞自己(脸红ing)。
PHP 发展到 3.0 版本的时候,此时 PHP 已经很普及了。“在 PHP3 的顶峰,Internet 上 10% 的 web 服务器上都安装了它”,PHP Manual 如是说。广泛的应用必然带来更高的要求。但此时的 PHP3 却有些力不从心了,这主要是因为 PHP3 采用的是边解释边执行的运行方式,运行效率很受其影响。其次,代码整体耦合度比较高,可扩展性也不够好,不利于应付各种各样需求。因此,此时在 PHP 界里已经有点中流砥柱作用的 Zeev Suraski 和 Andi Gutmans 决定重写代码以解决这两个问题。最终他们俩把该项技术的核心引擎命名为 Zend Engine,Zend 的意思即为 Zeev + Andi 。
Zend Engine 最主要的特性就是把 PHP 的边解释边执行的运行方式改为先进行预编译(Compile),然后再执行(Execute)。这两者的分开给 PHP 带来了革命性的变化:执行效率大幅提高;由于实行了功能分离,降低了模块间耦合度,可扩展性也大大增强。此时 PHP 已经能很方便的应付各种各样的 BT 需求了,而伴随 PHP 4.4.x ―可能是 PHP4 系列的最后一个分支―的发布,PHP 的大部分开发人员已经将注意力放在了 PHP5 或者 PHP6 上面,以后发布的基本上就是一些 Bug Fix Release。可以说第一代的 Zend Engine 是已经在站最后一班岗了。
2004 年 7 月,PHP5 发布,支持 PHP5 的是 Zend Engine 2.0 版本。这个版本主要是对 PHP 的 OO 功能进行了改进(我没有提集成 SQLite、PDO 等特性是因为我们现在谈的主要是 Zend Engine 而非 PHP)。核心执行方式(非 OO 部分)较PHP4 的1.0 版本变动不大,所以 PHP5 纯粹的执行速度相对于 PHP4 没有大的提高。而预计将于本月中旬发布的 PHP 5.1 版本则会携带 Zend Engine 2.1 版本,这个版本将提供新的执行方式,执行速度也会快上许多,至少要比 PHP5.0 相对于 PHP4.x 的差别要大很多,所以,PHP 5.1 将会是一个很了很令人期待的版本。
但并非 PHP5 系列的 Zend Engine 2 就完美无缺了。前面已经提到过,Zend Engine 将代码分成编译和执行两大部分。一般情况下,我们的代码完成以后就很少再去改变了。但执行时 PHP 却不得不还得一次又一次的重复编译,这根本就是毫无必要的。而且通常情况下,编译的所花费的时间并不比执行少多少,说是五五开并不为过,因此这极大的浪费了机器的 CPU。基于 Zend Engine 3.0 的 PHP6 将试图解决这个问题。除此之外,目前的 PHP 对多字节的字符处理也是 PHP 的一大致命缺陷。这在人们联系日益国际化的今天几乎是不可忍受的。而无数人在抨击 PHP 或 比较 ASP 等同类语言时总是不可避免的要提到这一点。同时受到 IBM 方面的压力,PHP6 也将会把对多字节字符的处理提到首要日程。这在 PHP6 的 Dev 版本中已经得到体现。
那么 PHP7 或者说 Zend Engine 4.0 会怎样?这个…… 汗……这个问题问得早了些吧。俺也不知道。俺只是目前对Zend Engine 4 有些想法或者改进意见而已,这我可能会在以后有时间另行写一篇文章来 YY 一下。
注:这是半年前的一篇文章了,其后由于个人事情未再继续更新。现在重新帖上来,希望能督促自己能切实完成一些事情。
http://www.yanbin.org/blog/zend-engine-introduction.html