如何编写 PHP 扩展 之 我的第一个PHP扩展
这里介绍使用C 做php 的扩展,首先得有PHP安装的源码,其次以下几步:
- 编写skel 原型
- 生成PHP扩展框架
- 编写自己的代码逻辑
- 编译成PHP扩展 *.so
- 拷贝到PHP扩展目录,重启PHP服务
- 调用自己的PHP扩展
其实在PHP源码里面已经说明了如何编写扩展:
vim ./php-5.6.7/README.EXT_SKEL
上面的几步除了1 ,3之外都不需要思考就能做的事,那么我们来实现一个简单的 a + b的扩展helloc函数,最终达到的目的:
<?php helloc(1022);?> // 输出为 32;
背景介绍完,现在开始:
编写skel 原型
到php安装目录下,创建文件 helloc.skel,并填写内容:
# cd ./php-5.6.7/ext/ # vim helloc.skel int helloc(int a int b)
生成PHP 扩展框架
在当前 ./php-5.6.7/ext/ 下执行:
# ./ext_skel --extname=helloc --proto=helloc.skel
会生成一个 helloc 的文件夹
编写自己的代码逻辑
进入helloc ,修改config.m4文件:
# cd helloc # vim config.m4
将如下三行的 dnl 删除:
dnl PHP_ARG_WITH(helloc for helloc support dnl Make sure that the comment is aligned: dnl [ --with-helloc Include helloc support])
修改后为:
PHP_ARG_WITH(helloc for helloc support Make sure that the comment is aligned: [ --with-helloc Include helloc support])
进行我们的重点,编写 a+b的逻辑。进入helloc.c ,
# vim helloc.c
找到如下函数,PHP_FUNCTION(helloc),并修改为如下:
PHP_FUNCTION(helloc) { int argc = ZEND_NUM_ARGS(); long a; long b; long re; // 新增的 if (zend_parse_parameters(argc TSRMLS_CC "ll" &a &b) == FAILURE) return; re = a+b; // 新增的 RETURN_LONG(re); // 新增的 }
好了,我们的逻辑写完了。
编译成PHP扩展 *.so
只剩下编译的活了
# /usr/bin/phpize # ./configure --with-php-config=/usr/bin/php-config # make
拷贝到PHP扩展目录,重启PHP服务
# cp modules/helloc.so /usr/lib64/php/modules/ # vim /etc/php.ini // 为php配置文件加上扩展(文件末尾就行) extension=helloc.so # service php-fpm restart // 这里你用的apache那么就需要重启 apache
调用自己的PHP扩展
最后写个test.php验证自己的扩展:
# vim test.php <?php echo helloc(1022); ?> # php test.php
结果:
OK,这就是你的第一个PHP扩展,完结。