10 2010 档案
摘要:OK,现在你已经有了一个安全的构建环境,也可以把模块编译进 PHP 了。那么,现在就让我们开始详细讨论一下这里面究竟是如何工作的吧~ 模块结构 所有的 PHP 模块通常都包含以下几个部分: 包含头文件(引入所需要的宏、API定义等); 声明导出函数(用于 Zend 函数块的声明); 声明 Zend 函数块; 声明 Zend 模块; 实现 get_modul...
阅读全文
摘要:实际上,在对静态或动态模块进行编译时没有太多故障处理工作要做。唯一可能的问题就是编译器会警告说找不到某些定义或者类似的事情。如果出现这种情况,你应该确认一下所有的头文件都是可用的并且它们的路径都已经在编译命令中被指定。为了确保每个文件都能被正确地定位,你可以先提取一个干净的 PHP 源码树,然后在 Ext 目录使用自动构建工具来创建这些文件。用这种方法就可以确保一个安全的编译环境。假如这样也不行,...
阅读全文
摘要:根据你所选择的不同的构建过程,你要么把扩展编译进一个新的PHP 的二进制文件,然后再连接到 Web 服务器(或以CGI 模式运行),要么将其编译成一个 .so (共享库)文件。如果你将上面的样例文件 first_module.c 编译成了一个共享库,那么编译后的文件应该是 first_module.so。要想使用它,你就必须把他复制到一个 PHP 能访问到的地方。如果仅仅是为了测试的话,简单起见,...
阅读全文
摘要:我们先来创建一个非常简单的扩展,这个扩展除了一个将其整形参数作为返回值的函数外几乎什么都没有。下面(“例3-2 一个简单的扩展”)就是这个样例的代码: 例3.2 一个简单的扩展 /* include standard header */#include "php.h" /* declaration of functions to be exported */ZEND_F...
阅读全文
摘要:PHP 提供了一套非常灵活的自动构建系统(automatic build system),它把所有的模块均放在 Ext 子目录下。每个模块除自身的源代码外,还都有一个用来配置该扩展的config.m4 文件(详情请参见http://www.gnu.org/software/m4/manual/m4.html )。 包括 .cvsignore 在内的所有文件都是由位于 Ext 目录下的 ext_s...
阅读全文
摘要:在我们开始讨论具体编码这个话题前,你应该让自己熟悉一下 PHP 的源码树以便可以迅速地对各个源文件进行定位。这也是编写和调试 PHP 扩展所必须具备的一种能力。 下表列出了一些主要目录的内容: 目录 内容 php-src 包含了PHP主源文件和主头文件;在这里你可以找到所有的 PHP API 定义...
阅读全文
摘要:正如上图(图3-1 PHP 内部结构图)所示,PHP 主要以三种方式来进行扩展:外部模块,内建模块各 Zend 引擎。下面我们将分别讨论这些方式: 外部模块 外部模块可以在脚本运行时使用 dl() 函数载入。这个函数从磁盘载入一个共享对象并将它的功能与调用该函数的脚本进行绑定并使之生效。脚本终止后,这个外部模块将在内存中被丢弃。这种方式有利有弊,如下表所示: 优点 ...
阅读全文
摘要:“扩展 PHP”说起来容易做起来难。PHP 现在已经发展成了一个具有数兆字节源代码的非常成熟的系统。要想深入这样的一个系统,有很多东西需要学习和考虑。在写这一章节的时候,我们最终决定采用“边学边做”的方式。这也许并不是最科学和专业的方式,但却应该是最有趣和最有效的一种方式。在下面的小节里,你首先会非常快速的学习到如何写一个虽然很基础但却能立即运行的扩...
阅读全文