PHP下C扩展开发
首先保证各位已经正确安装了PHP(笔者安装的PHP4.4.45版本)
下载PHP源码(笔者下载的是5.4.45版本 :https://github.com/captaim/php-src/archive/PHP-5.4.45.zip)
解压
进入解压后的源码的ext目录中(此目录存放的都是PHP的扩展,入openssl)/usr/local/src/php-5.4.45/ext
在此目录下执行生成扩展目录的操作,笔者生成的扩展名为test,我们会发现ext目录下生成了test目录
./ext_skel —extname=test
进入test(/usr/local/src/php-5.4.45/ext/test)目录,修改test目录下下的config.m4文件,修改如下(删除部分代码,config.m4第十一行左右)
dnl PHP_ARG_WITH(test, for test support, dnl Make sure that the comment is aligned: dnl [ --with-test Include test support])
将上面的代码修改为如下:
PHP_ARG_WITH(test, for test support, [ --with-test Include test support])
在test(/usr/local/src/php-5.4.45/ext/test)目录下,执行phpize操作,生成configure文件:
在test(/usr/local/src/php-5.4.45/ext/test)目录下执行 ./confiure:
在test(/usr/local/src/php-5.4.45/ext/test)目录下执行 make之后再执行make install:
php -i | grep php.ini查看php.ini的位置(非必要的步骤)
修改php扩展,加入test.so(这个名字和扩展的文件夹名字相同 ./ext_skel —extname=test ,就是此extname的值):
[test.so] extension=test.so
重启php(service php-fpm)之后,我们发现,此时test的扩展已经载入了
在/sites/sites/demo目录下新建一个demo001.php ,(confirm_test_compiled函数为test扩展里面test.c文件里的函数,相当于我们需要自己实现的扩展函数)。到此步骤,一个php扩展步骤的演示已经完成,下面展示的是如何完成自定义的函数
此文件的执行结果如下:
下面讲解的是php中自定义扩展函数的实现
在/usr/local/src/php-5.4.45/ext/test目录下修php_test.h文件(这个文件为定义函数的文件,test.c为具体实现函数的文件)
47 PHP_FUNCTION(confirm_test_compiled); /* For testing, remove later. */
将上面的部门修改为(加入PHP_FUNCTION(test_hello);)
47 PHP_FUNCTION(confirm_test_compiled); /* For testing, remove later. */ 48 PHP_FUNCTION(test_hello);
在/usr/local/src/php-5.4.45/ext/test目录下的test.c(php_test.h中定义的函数的具体实现文件)中具体实现这个”test_hello”这个函数
PHP_FUNCTION(test_hello) { long a; long b; char *c; int c_len; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"lls", &a, &b, &c, &c_len) == FAILURE){ return; } char *str; int len = spprintf(&str, 0, "%s: %d\n",c, a*b); RETURN_STRINGL(str, len, 0); }
具体如图:
在/usr/local/src/php-5.4.45/ext/test目录下的test.c中将实现的函数注册到zend中
修改如下加入 『PHP_FE(test_hello,NULL)』,具体如图
在/usr/local/src/php-5.4.45/ext/test目录下make && make install
任意目录下执行『php —rf “test_hello”』查看函数是否存在,如果存在,表示添加的函数已经完成,我们就可以在php程序中使用了
我们新建一个demo002.php文件,调用自定义的扩展函数
运行结果如下,表示成功