一、环境
1、ext_skel生成框架
./ext_skel --extname=hello,会生成hello目录
ext_skel在php源码包里有,还需要skeleton目录,也在一起。
2、修改config.m4
dnl是注释的意思
if ... use with
Otherwise use enable
一般用enable的,把下面三行的dnl去掉
3、phpize生成configure
/usr/local/bin/或者找php安装目录下面的bin里面(如/usr/local/php/bin/)
4、configure
CFLAGS=-std=c99 ./configure --enable-hello --with-php-config=/usr/local/php/bin/php-config
CFLAGS=-std=c99:指定c99编译,貌似有的环境默认不是c99,所以要指定
--enable-hello:貌似不加也可以,有待进一步研究
--with-php-config=/usr/local/php/bin/php-config:设置当前php环境获取命令,一般跟phpize一起
5、make;make install
编译安装,会将.so复制到php的扩展目录下(就是php-config读出来的)
6、加载
改php.ini,跟其他扩展一样,重启
有可能php自动加载这个扩展目录下的所有扩展,这样只要重启就行了
7、phpinfo就可以看见了
二、开发
1、入口文件hello.c
2、配置入口函数
搜索:
zend_function_entry,里面应该有一个demo,模仿加自己的函数就好
3、编写函数
PHP_FUNCTION(hello_world) {}
5、输出return_value
这个变量默认就有,往里面写的数据就是输出数据
array_init(return_value);//把返回数据初始化成数组
add_assoc_zval(return_value, "hello", helloArr);//往返回值中放一个数组,相当于$return_value[”hello"]=$helloArr
6、一个php数组
zval *helloArr;
ALLOC_INIT_ZVAL(helloArr);
array_init(helloArr);
add_next_index_long(helloArr, 1);
......
7、其他.c
要修改
config.m4最后面的PHP_NEW_EXTENSION
PHP_NEW_EXTENSION(hello, hello.c hello1.c src/hello2.c, $ext_shared)
hello1.c src/hello2.c就是要一起打包的文件
8、php里就可以这么用了
$res = hello_world(123);
9、调试
用命令行php某个php文件,可以看见扩展中的printf打印的内容
一般搞个main.c先把核心流程调通,然后再接入口文件