目前准备做的东西,选择了APACHE2+PHP5来做开发平台,主要是看中了PHP的可以用C写扩展模块的优势。
在网上找了两篇教程
http://www.phpchina.com/bbs/archiver/tid-673.html
http://www.oklinux.cn/html/developer/php/jc/20070919/36336.html
相互参照,终于算是搞明白点了
PHP的扩展可分为三种:
(1)C写共享库,然后使用dl()来装载,然后调用
(2)编译进PHP,然后直接调用
(3)在ZEND里面实现
实验了第一种与第二种方法,第三种目前还没测试
第一种与第二种的的开发步骤开始阶段差不多
以$PHP_SRC表示php源码包的起始目录
(1)# cd $PHP_SRC/ext
(2)$PHP_SRC/ext# ./ext_skel --extname=ur_php_module
这一步生成目录 $PHP_SRC/ext/ur_php_module目录,里面的主要文件有 config.m4 config.w32 .cvsignore ur_php_module.c php_ur_php_module.h这几个文件
(3)修改config.m4,确定是使用--with-xxx还是--enable-xxx的语法
4)在php_ur_php_module.h中增加自己的函数声明
PHP_FUNCTION(ur_func);
(5)在ur_php_module.c中先定义函数入口
zend_function_entry ur_php_module_functions[] = {
PHP_FE(confirm_ur_php_module_compiled, NULL) /* For testing, remo ve later. */
PHP_FE(ur_func,NULL)
{NULL, NULL, NULL} /* Must be the last line in dwb_mail_functions[] */
};
然后下面添加ur_func的具体定义
PHP_FUNCTION(ur_func)
{
zend_printf("My Php Extension...");
}
好了,如果想要使用共享扩展,那么
第一步:你手工可以编译ur_php_module.c生成.so文件
gcc -fpic -DCOMPILE_DL_UR_PHP_MODULE=1 -I/usr/local/include -I. -I../main -I.. -I../TSRM -I../Zend -c -o ur_php_module/ur_php_module.o ur_php_module/ur_php_module.c
gcc -shared -L/usr/local/lib -rdynamic -o ur_php_module/ur_php_module.so ur_php_module/ur_php_module.o
这种方法可以更灵活,能够自己添加任意需要的其他库文件。
还可以在按照以下步骤来生成so文件
(1)$PHP_SRC/ext/ur_php_module# ./phpize
(2)$PHP_SRC/ext/ur_php_module# ./buildconf --force
生成配置文件
(3)$PHP_SRC/ext/ur_php_module# ./configure [--enable|--with]-ur_php_module
(4)make
,编译成功后,会在当前目录下发现有modules目录,里面有编译出来的.so文件
第二步:把.so文件copy到php.ini的extension_dir指定的目录中,如果你不想在php页面中每次使用自定义的方法都事先dl()一下,那么你可以在下面加上一行
extension=ur_php_module.so
如果你想使用静态扩展,
那么你需要回到$PHP_SRC目录,
(1)$PHP_SRC# ./buildconf --force
生成配置文件
(3)$PHP_SRC# ./configure [--enable|--with]-ur_php_module --with-apxs2=/usr/local/apache2/bin/apxs
(4)make clean
(5)make
(6)make install
然后重启apache
如果配置成功,怎在phpinfo()里就会显示我们自己的模块来,
ur_php_module
ur_php_module support enabled
在php页面里就可以直接调用你自己的函数了。
需要注意到是,如果你重新编译、安装php话最好先执行make clean一下,否则可能部分文件不会被重新编译,导致扩展模块无效。