1. 生成拓展
进入源代码包的ext目录:php-5.2.17/ext
./ext_skel --extname=world(例如,我们编写一个world名字的拓展)修改config.m4 vi ext/world/config.m4
编译的时候,选择的模式
(文件中的dnl表示注释的意思,去掉dnl和最后的那个括号,否则编译会报错的)
dnl [ --with-world Include world support])
dnl [ --enable-world Enable world support])
2. 给world拓展定义函数的方法(使用例子里自己生成的来做哈)
在ext/world/php_world.h头文件里,定义函数声明(和C语言一样)
PHP_FUNCTION(confirm_world_compiled);
进入到ext/world/world.c程序文件中
zend_function_entry world_functions[] 这里面添加函数的信息。
函数体:(PHP_FUNCTION,这个函数只是一个简单的输出功能)
zend_parse_parameters,用来获取函数的传参并且检查。
传递两个参数的写法:
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &r1, &n, &r2, &m) == FAILURE
传参数的分类:
l long 符号整数
d double 浮点数
s char *, int 二进制字符串,长度
b zend_bool 逻辑型(1或0)
r zval * 资源(文件指针,数据库连接等)
a zval * 联合数组
o zval * 任何类型的对象
O zval * 指定类型的对象。需要提供目标对象的类类型
z zval * 无任何操作的zval
返回值的分类:
RETURN_LONG(l) RETVAL_LONG(l) 整数
RETURN_BOOL(b) RETVAL_BOOL(b) 布尔数(1或0)
RETURN_NULL() RETVAL_NULL() NULL
RETURN_DOUBLE(d) RETVAL_DOUBLE(d) 浮点数
RETURN_STRING(s, dup) RETVAL_STRING(s, dup) 字符串
RETURN_STRINGL(s, l, dup) RETVAL_STRINGL(s, l, dup) 长度为l的字符串值。与上一个宏一样,但因为s的长度被指定,所以速度更快。
RETURN_TRUE RETVAL_TRUE 返回布尔值true。注意到这个宏没有括号。
RETURN_FALSE RETVAL_FALSE 返回布尔值false。注意到这个宏没有括号。
RETURN_RESOURCE(r) RETVAL_RESOURCE(r) 资源句柄。
3. 编译函数
./buildconf --force(重新编译configure文件)
./configure --prefix=/home/admin/php --with-world
编译后:
执行make test进行功能回归,看看新增的拓展是否会影响原来的功能。
make && make install
查看php -m,看见拓展已经被安装
[PHP Modules]
world
4.验证模块
<?php
echo confirm_world_compiled(world);
?>
恭喜你,拓展安装成功了哈。
5. 绿色加载的拓展