September 2006


实际上,在对静态或动态模块进行编译时没有太多故障处理工作要做。唯一可能的问题就是编译器会警告说找不到某些定义或者类似的事情。如果出现这种情况,你应该确认一下所有的头文件都是可用的并且它们的路径都已经在编译命令中被指定。为了确保每个文件都能被正确地定位,你可以先提取一个干净的 PHP 源码树,然后在 Ext 目录使用自动构建工具来创建这些文件。用这种方法就可以确保一个安全的编译环境。假如这样也不行,那就只好试试手动编译了。

PHP 也可能会警告说在你的模块里面有一些未定义的函数。(如果你没有改动样例文件的话这种情况应该不会发生。)假如你在模块中拼错了一些你想访问的外部函数的名字,那么它们就会在符号表中显示为“未能连接的符号”。这样在 PHP 动态加载或连接时,它们就不会运行--在二进制文件中没有相应的符号。为了解决这个问题,你可以在你的模块文件中找一下错误的声明或外部引用。注意,这个问题仅仅发生在动态可加载模块身上。而在静态模块身上则不会发生,因为静态模块在编译时就会抛出这些错误。

根据你所选择的不同的构建过程,你要么把扩展编译进一个新的PHP 的二进制文件,然后再连接到 Web 服务器(或以CGI 模式运行),要么将其编译成一个 .so (共享库)文件。如果你将上面的样例文件 first_module.c 编译成了一个共享库,那么编译后的文件应该是 first_module.so。要想使用它,你就必须把他复制到一个 PHP 能访问到的地方。如果仅仅是为了测试的话,简单起见,你可以把它复制到你的 htdocs 目录下,然后用“例3.3 first_module.so 的一个测试文件”中的代码来进行一下测试。如果你将其直接编译编译进 PHP 二进制文件的话,那就不用调用 dl() 函数了,因为这个模块的函数在脚本一开始运行就生效了。

警告:

为了安全起见,你不应该将你的动态模块放入一个公共目录。即使是一个简单的测试你可以那么做,那也应该把它放进产品环境中的一个隔离的目录。

例3.3 first_module.so 的一个测试文件


<?php
// remove next comment if necessary
// dl("first_module.so");
$param = 2
$return = first_module($param);
print("We sent '$param' and got '$return'");
?>

调用这个测试文件,结果应该输出为:We sent ‘2’ and got ‘2’。

若有需要,你可以调用 dl() 函数来载入一个动态可加载模块。这个函数负责寻找指定的共享库并进行加载使其函数在 PHP 中生效。这个样例模块仅输出了一个函数 first_module(),这个函数仅接受一个参数,并将其转换为整数作为函数的结果返回。

如果你已经进行到了这一步,那么,恭喜你,你已经成功创建了你的第一个 PHP 扩展!

在今天凌晨,Turbo Explorer 发布倒计时牌终于置零。随后,Borland 也放出了下载链接。一路小跑,安装过了,开始菜单程序组的名字还是叫作 Borland Developer Studio 2006。安装时必须先卸载 BDS 2006 才能继续安装 Turbo Delphi Explorer。安装的默认目录依旧是 C:\Program Files\Borland\BDS\4.0\,内部版本号为 10.0.2288.42451 Update 2。对比了一下 BDS 2006 和 Turbo Delphi 的特性列表,几乎毫无差别。看来仍然是换汤不换药,新瓶装老酒啊。甚至可以说连汤和瓶都没换,只是换了个标签。这个 Borland 啊~

作为 PHP 6 重大更新之一的 APC 现在已经从 PHP Internal 部分独立出来有了属于自己邮件列表了:APC development,APC 的主要开发者,PHP 的创始人 Rasmus Lerdorf 当仁不让地主持了工作,PHP Core方面的不少牛人也将在那里出没。关心这方面工作地朋友一定要订阅哦~

'