您的位置:首页 > 编程语言 > PHP开发

php 扩展开发

2015-10-15 12:43 597 查看
一、环境

1、ext_skel生成框架

./ext_skel --extname=hello,会生成hello目录
ext_skel在php源码包里有,还需要skeleton目录,也在一起。
php下载

ext_skel脚本下载

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) {}

4、参数输入用zend_parse_parameters

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就是要一起打包的文件

注意:各个.c之间没有逗号,

8、php里就可以这么用了
$res = hello_world(123);

9、调试
用命令行php某个php文件,可以看见扩展中的printf打印的内容
一般搞个main.c先把核心流程调通,然后再接入口文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: