欢迎来到天天文库
浏览记录
ID:33316420
大小:390.00 KB
页数:62页
时间:2019-02-24
《深入理解php内核》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、ZendAPI:深入PHP内核byyAnbiNben.yan@msn.com(二)摘要 摘要知者不言,言者不知。 ――老子《道德经》五十六章有时候,单纯依靠PHP“本身”是不行的。尽管普通用户很少遇到这种情况,但一些专业性的应用则经常需要将PHP的性能发挥到极致(这里的性能是指速度或功能)。由于受到PHP语言本身的限制,同时还可能不得不把庞大的库文件包含到每个脚本当中,因此,某些新功能并不是总能被顺利实现,所以我们必须另外寻找一些方法来克服PHP的这些缺点。了解到了这一点,我们就应该接触一下PHP的心脏并探究一下它的
2、内核--可以编译成PHP并让之工作的C代码--的时候了。(三)概述 概述“扩展PHP”说起来容易做起来难。PHP现在已经发展成了一个具有数兆字节源代码的非常成熟的系统。要想深入这样的一个系统,有很多东西需要学习和考虑。在写这一章节的时候,我们最终决定采用“边学边做”的方式。这也许并不是最科学和专业的方式,但却应该是最有趣和最有效的一种方式。在下面的小节里,你首先会非常快速的学习到如何写一个虽然很基础但却能立即运行的扩展,然后将会学习到有关ZendAPI的高级功能。另外一个选择就是将其作为一个整体,一次性的讲述所有的这些操作、设计、技巧和诀窍等
3、,并且可以让我们在实际动手前就可以得到一副完整的愿景。这看起来似乎是一个更好的方法,也没有死角,但它却枯燥无味、费时费力,很容易让人感到气馁。这就是我们为什么要采用非常直接的讲法的原因。注意,尽管这一章会尽可能多讲述一些关于PHP内部工作机制的知识,但要想真的给出一份在任何时间任何情况下的PHP扩展指南,那简直是不可能的。PHP是如此庞大和复杂,以致于只有你亲自动手实践一下才有可能真正理解它的内部工作机制,因此我们强烈推荐你随时参考它的源代码来进行工作。Zend是什么?PHP又是什么?Zend指的是语言引擎,PHP指的是我们从外面看到的一套完
4、整的系统。这听起来有点糊涂,但其实并不复杂(见图3-1PHP内部结构图)。为了实现一个WEB脚本的解释器,你需要完成以下三个部分的工作:1、 解释器部分,负责对输入代码的分析、翻译和执行;2、 功能性部分,负责具体实现语言的各种功能(比如它的函数等等);3、 接口部分,负责同WEB服务器的会话等功能。Zend包括了第一部分的全部和第二部分的局部,PHP包括了第二部分的局部和第三部分的全部。他们合起来称之为PHP包。Zend构成了语言的核心,同时也包含了一些最基本的PHP预定义函数的实现。PHP则包含了所有创造出语言本身各种显著特性的模块。 图
5、3-1 PHP内部结构图下面将要讨论PHP允许在哪里扩展以及如何扩展。(四)可扩展性正如上图(图3-1PHP内部结构图)所示,PHP主要以三种方式来进行扩展:外部模块,内建模块各Zend引擎。下面我们将分别讨论这些方式:外部模块外部模块可以在脚本运行时使用dl()函数载入。这个函数从磁盘载入一个共享对象并将它的功能与调用该函数的脚本进行绑定并使之生效。脚本终止后,这个外部模块将在内存中被丢弃。这种方式有利有弊,如下表所示:优点缺点外部模块不需要重新对PHP进行编译。共享对象在每次脚本调用时都需要对其进行加载,速度较慢。附加的外部模块文件会让
6、磁盘变得比较散乱。PHP通过“外包”方式来让自身的体积保持很小。 每个想使用该模块功能的脚本都必须使用dl()函数手动加载,或者在php.ini文件当中添加一些扩展标签(这并不总是一个恰当的解决方案)。综上所述,外部模块非常适合开发第三方产品,较少使用的附加的小功能或者仅仅是调试等这些用途。为了迅速开发一些附加功能,外部模块是最佳方式。但对于一些经常使用的、实现较大的,代码较为复杂的应用,那就有些得不偿失了。第三方可能会考虑在php.ini文件中使用扩展标签来创建一个新的外部模块。这些外部模块完全同主PHP包分离,这一点非常适合应用于一些商业
7、环境。商业性的发行商可以仅发送这些外部模块而不必再额外创建那些并不允许绑定这些商业模块的PHP二进制代码。内建模块内建模块被直接编译进PHP并存在于每一个PHP处理请求当中。它们的功能在脚本开始运行时立即生效。和外部模块一样,内建模块也有各有利弊,列表如下:优点缺点无需专门手动载入,功能即时生效。修改内建模块时需要重新编译PHP。无需额外的磁盘文件,所有功能均内置在PHP二进制代码当中。PHP二进制文件会变大并且会消耗更多的内存。Zend引擎当然,你也能直接在Zend引擎里面进行扩展。如果你需要在语言特性方面做些改动或者是需要在语言核心内置一
8、些特别的功能,那么这就是一种很好的方式。但一般情况下应该尽力避免对Zend引擎的修改。这里面的改动会导致和其他代码的不兼容,而且几乎没有人会适应打过特殊补丁的Zen
此文档下载收益归作者所有