作者:empty 出版社:empty |
有时候, 单纯依靠PHP“本身 是不行的。尽管普通用户根少遇到这种情况.但一些专业性的应用则经常要将PHP的性能发挥到极致(这里的性能是指速度或功能) 。由于受到PHP语言本身的制, 卜时还可能不得不把魔大的库文件包含到每个脚本当中,因此,某些新功能并不是总能被顺利实现,所以我们必须另外寻我一些方法来克骶PHP的这我妹点。了解到了这一点, 我们就应该接触一下PHP的心脏井探宄一下它的内核一―可以编译成PHP并让之工作的C代码一一的时候了.
“扩展PHP说起来容易做起来难, PHP现在已经发展成了一个具有数兆字节源代码的非常成熟的系统要想深入这样的一个系统,有很多东西需要学习和考店,在写这一章节的时候,我们最终决定采用“边学边做“的方式。这也许井不是最科学和专业的方式,识却应该是最有趣和最有效的一种方式。在下面的小节里,你首先会丰常快速的学习到如何写一个虽然很基础但却能立即运行的扩展, 然后将会学习到有关ZendAPI的高级功能。另外一个选择就是将其作为一个整体, 一次性的讲述所有的这些操作, 设计、技巧和诀窗等,并且可以让我们在实际动手前就可以得到一副完整的框景、这看起来似乎是一个更好的方法,也没有死角,但它却枯燥无味、贵时费力,很容易让人感到气馁。这就是我们为什么要采用非活直接的讲法的原因,注意, 尽管这一章会尽可能多讲述一些关于PHP内部工作机制的知识, 但要想真的给出一份在任何时间任何情况下的PHP扩展指南, 那简直是不可能的。PHP是如此庞大和复杂, 以致于只有你亲自动手实践一下才有可能真正理解它的内部工作机制,国此我们强烈推荐你随时参考它的源代码来进行工作。Zend是什么?PHP又是什么?Zend指的是语言引擎。PHP指的是我们从外面看到的一套完整的系统, 这听起来有点糊涂, 但其实并不复杂(见图3-1PHP内部结构图) , 为了实现一个WEB脚本的解释器, 你常要完成以下三个部分的工作
1.解释器部分,负责对输入代码的分析、翻译和执行:2、功能性部分,负责具体实现语言的各种功能(比如它的函数等等):3、接口部分, 负责同WEB服务器的会话等功能。Zend包括了第一部分的全部和第二部分的同部, PHP包括了第二部分的局部和第三部分的全部-他们合起米称之为PHP包.Zend构成了语言的核心, 同时也包含了一些最基本的PHP预定义函数的实现.PHP则包含了所有创造出语言本身各种显著特性的模块.
共享对象在每次脚本调用时都需要对其进行加载,速度较慢。每个想使用该模块功能的脚本都必须使用dl()函数手动加载,或者在php.in i文件当中添加一些扩展标签(这并不总是一个恰优点缺点可以编译为动态可教入的模块。(至少这些是可以的)Zend和PHP的“线程安全资源管理器”(T SRM) 目录。附加的外部模块文件会让磁盘变得比较散乱。这个目录包含主要的PHP宏和定义。(重要)当的解决方案),综上所述,外部模块非常适合开发第一方产品,较少使用的附加的小功能或者仪仅是调试等这些用途。为了迅速开发些附加功能,外部模块是最佳方式。但对于些经常使用的、实现较大的,代码较为复杂的应用,那就有些得不偿失了。第三方可能会考虑在php.in i文件中使用扩展标签来创建个新的外部模, 这些外部模块完全同主PHP包分离,这一点丰常适合应用于一些商业环境。商业性的发行商可以仅发送这些外部模块而不必再顺外创建那热井不允许绑定这些商业模块的PHP二制代码。内建模块内建模块被直接编译透PHP并存在于每一个PHP处理请求当中。它们的功能在脚本开始运行时立生效、和外部模块一样,内建模块也有各有利弊,列表如下:无需额外的磁盘文件, 所有功能均内置在PHP二PHP二进制文件会变大并且会耗
当然, 你也能直接在Zend引擎里而进行扩展。如果你需要在语言特性方面做些改动或者是需要在语言接心内置一些特别的功能, 那么这就是一种很好的方式, 但一般情况下应该尽力避免对Zend引擎的修改,这里面的改动会导致和其他代码的不兼容, 而且儿乎没有人会适应打过特殊补丁的Zend引擎。况且这些读动与主PHP源代码是不可分割的, 因此就有可能在下一次的官方的源代码更新中被覆盖掉, 因此, 这种方式通常被认为是“不良的习惯”。由于使用极其少,本章将不再对此进行资述.在我们开始讨论具体编码这个话题前, 你应该让白己熟恶一下PHP的源码树以便可以迅速地对各个源文件进行定位, 这也是编写和调试PHP扩展所必须具备的一种能力,php-src/ext源码树中的“官方”PHP模块。自PHP 4.0开始, 这些PHP标准扩展都php-src/pear这个目录就是“PHP扩展与应用仓库”的目录, 包含了PEAR的核心文件,当然, 讨论PHP包里面全部每一个文件无疑是超出了本章的范用, 但你还是应该仔细看一下下面的几个除此之外, 你也应该注意一下这些文件所包含的一些文件。举例来说, 愿些文件与Zend执行器有关, 哪些文件又为PHP初始化工作提供了支持等等, 在阅读完这些文件之后, 你还可以花点时间再围绕PHP包来看一些文件,了解一下这些文件和模块之间的依赖性--它们之间是如何赖于别的文件又是如何为其他文件提供支持的。同时这也可以帮助你适应一下PHP刨作者们代码的风格。要想扩展PHP, 你应读尽Zend是用一些特定的规范构建的。为了避免破坏这些规范, 你应该遵备以下的几个规则几子对于每一项直要的任务, Zend都预先提供了极为方史的宏、在下面章节的图表里将会描述到大部分基本购数、结构和宏。这些宏定义大多可以在Zend h和Zend_API h中找到, 我们建议您在学习完本节之后仔细看一下这些文件,(当然你也可以现在就阅读这些文件,但你可能不会留下太多的印象。)资源管理仍然是一个极为关键的问题,尤其是对服务器软件而言。资源里最具宝贵的则非内存英属了,内存管理也必须极端小心:内存管理在Zend中已经被部分抽象, 而且你也应该坚持使用这些抽象, 原因显而易兒:山于得以抽象, Zend就可以完全控制内存的分配。Zend可以确定一块内存是否在使用, 也可以自动释放未使用和失去引用的内存块,因此就可以避免内存泄漏。下表列出了一些常用函数:无需专门手动载入,功能即时生效。
包含了PHP主源文件和主头文件:在这里你可以找到所有的PHP API定义、宏等内容。(重要).其他的一些东西你也可以在这里找到这里是存放动态和内建模块的仓库:默认情况下,这些就是被集成于主包含了Zend引擎文件:在这里你可以找到所有的Zend API定义与宏包含了不同服务器抽象层的代码