编写PHP的C扩展

来源:互联网 发布:yy上的网络兼职是真的吗 编辑:程序博客网 时间:2024/03/29 14:53


为了提高逼格,我决定自己实现PHP的扩展再见


一、步骤过程
1、编写预定义文件
#vim /root/mark_function_module.def
内容为
int a(int x,int y)


2、生成扩展目录(mark_function_module为模块名)
#cd /usr/local/php/ext
#./ext_skel --extname=mark_function_module --proto=/root/mark_function_module.def


3、修改config.m4
#vim /usr/local/php/ext/mark_function_module/config.m4
去掉dnl的注释
PHP_ARG_ENABLE(mark_function_module, whether to enable mark_function_module support,
Make sure that the comment is aligned:
[  --enable-mark_function_module           Enable mark_function_module support])


4、修改 mark_function_module.c
#vim /usr/local/php/ext/mark_function_module/mark_function_module.c
定位/PHP_FUNCTION(a)
修改如下:
PHP_FUNCTION(a)
{
int argc = ZEND_NUM_ARGS();
int x;
int y;
int z;
if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE) 
return;
z=x+y;
RETURN_LONG(z);
}


5、生成扩展库
#cd /usr/local/php/ext/mark_function_module
#/usr/local/php/bin/phpize
#./configure --with-php-config=/usr/local/php/bin/php-config
#make
#make install


6、复制生成的动态库到/usr/local/php/modules目录
生成的动态库会在
# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
复制
cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/mark_function_module.so /usr/local/php/modules/mark_function_module.so


7、修改php.ini
修改
extension_dir = "/usr/local/php/modules"
添加
extension=mark_function_module.so


8、重启apache
# /usr/local/apache/bin/apachectl restart


9、检查是否加载
 # /usr/local/php/bin/php -m


10、编写程序测试
# vim /usr/local/apache/htdocs/test_ext.php
内容如下
echo a(1,2);
如果输出为3,表示可以调用了~说好的逼格再见


二、可能遇到的问题
1、步骤过程第五步的时候
执行/usr/local/php/bin/phpize可能会报错
Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script


解决方案
# wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz 
# tar -zvxf m4-1.4.9.tar.gz 
# cd m4-1.4.9/ 
# ./configure && make && make install


 # wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz 
 # tar -zvxf autoconf-2.62.tar.gz 
 # cd autoconf-2.62/ 
 # ./configure && make && make install
 然后再在mark_function_module的目录下,执行/usr/local/php/bin/phpize

0 0