下面的内容主要围绕这三个文件展开 。
Unix Build 配置
开发PHP扩展组件的第一步不是写实现代码,而是要先配置好Build 选项 。由于我们是在Linux下开发,所以这里的配置主要与.m4有关 。
关于Build 配置这一块,要是写起来能写一大堆,而且与Unix系统很多东西相关,就算我有兴趣写估计大家也没兴趣看,所以这里我们从略,只拣关键地方说一下,关于.m4更多细节可以参考这里 。
打开生成的.m4文件,内容大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
dnl $Id$
dnl .m4for
dnlin thisfile start with the'dnl' .
dnlwhere . Thisfile will not work
dnl.
dnl If your, use with:
dnl (,for,
dnl Make sure that theis :
dnl [ --with-])
dnluse:
dnl (,to,
dnl Make sure that theis :
dnl [ ---])
if test "$" !="no" ;then
dnl Writemoreof tests here...
dnl# --with- -> check with-path
dnl = "/usr/local /usr" # you might want tothis
dnl = "//.h" # you mostwant tothis
dnlif test -r $/$;then # path given as
dnl =$
dnlelse #path list
dnl ([ forfilesinpath])
文章插图
dnlfor iin $ ;do
dnlif test -r $i/$;then
dnl =$i
dnl (foundin $i)
dnlfi
dnldone
dnlfi
dnl
dnlif test -z"$" ;then
dnl ([not found])
dnl ([the])
dnlfi
dnl# --with- -> addpath
dnl ($ / )
dnl# --with- -> check for lib and
dnl =# you may want tothis
dnl =# you mostwant tothis
dnl ($,$,
dnl [
dnl _PATH($, $ /lib , ADD)
dnl (,1,[ ])
dnl ],[
dnl ([wronglibor lib not found])
dnl ],[
dnl -L$ /lib -lm
dnl ])
dnl
dnl (ADD)
(, .c, $)
fi
不要看这么多,因为所有以“dnl”开头的全是注释,所以真正起作用没几行 。这里需要配置的只有下面几行:
1
2
3
4
5
6
7
8
9
10
11
dnl If your, use with:
dnl (,for,
dnl Make sure that theis :
dnl [ --with-])
dnluse:
dnl (,to,
dnl Make sure that theis :
dnl [ ---])
我想大家也都能看明白,意思就是“如果你的扩展引用了外部组件,使用…,否则使用…” 。我们的扩展并没有引用外部组件,所以将“ use ”下面三行的“dnl”去掉,改为:
1
2
3
4
5
dnluse:
(,to,
Make sure that theis :
[ ---])
保存,这样关于Build 配置就大功告成了 。
PHP 及结构分析
以上可以看成是为开发PHP扩展而做的准备工作,下面就要编写核心代码了 。上文说过,编写PHP扩展是基于Zend API和一些宏的,所以如果要编写核心代码,我们首先要弄清楚PHP 的结构 。因为一个PHP 在C语言层面实际上就是一个结构体,这点可以从“.h”中得到证实 。打开“.h”,会看到里面有怎么一行:
1
ry;
ry就是扩展的C语言对应元素,而关于其类型的定义可以在PHP源代码的“Zend/.h”文件里找到,下面代码是的定义:
1
2
3
4