Practical PHP Programming

早期版本的PHP

PHP语言是Rasmus Lerdorf创造出来的,它的历史可以追溯到(20世纪)90年代中叶,当时主要用来使web任务处理起来简单一些,减少重复劳动。那时候,使用PHP的主要目的是以最小的逻辑代价来达到所需的结果,这就导致PHP是以HTML为中心的——PHP代码是被嵌入到HTML代码当中的。

第一个流行的PHP版本被称为PHP/FI 2.0,意为“个人主页/表单解释程序”(Personal Home Page/Form Interpreter)。尽管它的语法都还没有统一,但还是成功吸引到了包括我在内的不少信徒。那时候存在的最大问题是PHP/FI的语法分析器大部分是手写的,因此,用户经常遇到不是因为技术原因引起的脚本错误,而仅仅是因为PHP/FI的语法分析器太烂了。而且,分析器完全绑定到Apache web服务器上,也就不可能有很高的效率。

作者说明:语法分析器(parser)将你的脚本转换为计算机能够理解的机器语言。语法分析器来自单词“parse”,意思是将文本分解成各个成分并进行分析。

在Zeev Suraski和Andi Gutmans用像Flex和Bison这样的标准的“编译程序编译器”从头重写了PHP之后,其中一些问题在PHP 3中就被解决了。这一改变使得编译器更加健壮,同时也给很多PHP用户带来了信心。

PHP 3同时也是一种可扩展的语言,这在之前的版本中是从来没有过的。一些特别热情的开发者用PHP编写自己的模块来增加一些核心功能。 语法分析器当时仍然绑定在Apache上,虽然效率同PHP/FI相比有了很大的进步,但是仍然没有很出众的地方。

升级到PHP 3唯一一点负面消息是PHP 3比之前更加严格了——一些在PHP/FI下正常工作的代码在升级之后无法工作了。PHP 3当时还算小众,因此也没有产生太大影响。

从PHP/FI到PHP 3的全面升级使得一些Perl用户想要尝试一下这个更加容易使用的系统。那时,除了那些对PHP钻研透彻的人,对大众而言,Perl无疑具有更快的执行效率,然而PHP在开发效率方面领先,这也是PHP的关键卖点。

PHP 3开始对面向对象进行有限的支持,这相当于给PHP的增长又加了一把火。到2000年中期PHP 3被换掉的时候,已经有超过2,500,000个站点使用PHP了,而18个月之前仅有250,000个站点使用。

2000年中期,PHP 4发布,与PHP 3几乎在各个方面都不相同。由于当时PHP向后兼容的扩展程序已经完成,从PHP 3升级到PHP 4比上次从PHP/FI到PHP 3的升级平滑得多。

或许PHP 4最重要的改进是将PHP切换到了Zend引擎上。Zend引擎是Zeev Suraski和Andi Gutmans创建的Zend公司的产品,用来提升PHP的整体环境,同时也使PHP较之以往有更强的灵活性。引擎接管了PHP的核心,引入了引用计数,使得引擎能够自动追踪脚本所使用的资源,同时能够自动释放内存,保证没有内存泄漏。

同时,PHP 4也完全从web服务器中分离出来,意味着PHP可以在Apache 2,微软的IIS,Zeus甚至其他的web服务器上运行。PHP的开放使用使得世界上有大约50%的PHP程序没有使用Apache作为他们的web服务器。

由于上述两个主要因素,PHP的性能有了一个巨大的跳跃。首先,PHP的执行范本同之前版本不同。PHP 3和以前版本使用一种叫做“边解释边执行”的方式,也就是说,PHP读一行代码,解释这行代码,执行这行代码,再读下一行代码,解释,执行,循环往复。这就意味着代码可能会被重复阅读和执行多次,而这时完全没有必要的。

PHP采用新的“先编译后执行”的方式,先整体读入你的脚本并编译成二进制码,之后再执行,极大提高了效率——平均速度提高了大约100%,一些标准检测程序甚至表明,在PHP 4达到极限的时候,代码性能有了50倍的提升。

作者说明:“二进制码”(Byte Code)是由你的脚本转化而来的PHP能够读懂的语言——通常来说,二进制码由于要被分解成很多简单的代码片段,所以往往要比你本身的脚本要长很多。

此外,由于PHP 4在执行之前先将整个版本进行编译,使得在执行之前优化和缓存编译后的代码称为可能。本书稍后将会阐述这是怎样工作的。

其次,PHP 4引入了多线程,可以显著缩短运行时间,非核心函数独立于主脚本进程来运行,促进了流线型化执行。

PHP 4在2007年底将不再提供支持服务,因此我们也不应该用其来编写新的代码了。