一、说明
前端时间因为客户的原因折腾了一下asp的扩展,在ATL的帮助下写一个asp的模块还是很容易的。不巧的时刚刚折腾完
asp的COM就碰到另一个客户的
问题。客户想给系统集成ICBC的接口,但是用ICBC的接口需要用他们的提供的库函数去
1. sign对发送的数据进行签名
2. getcertid获取用户证书的版本
3. verifySign对签名后的数据进行验证
问题是ICBC只给了现成的COM组件,意味在只能在Win的主机上使用。俺们公司只有linux的主机,在*nix上就要自己想办法调用ICBC给的静态库了。对此我们有两个想法
1.用ICBC的静态库做一个独立的执行文件,用PHP的系统调用函数来执行这个独立的执行文件
2.将ICBC的静态库做出一个PHP的扩展
方法一应该比较简单,但是远不如方法二的灵活。搞成PHP的扩展,只要服务器编译一次,服务器上的所有客户都可以用的。
有ASP的前科,俺觉得搞个PHP的也不是什么难事。操起google搜了一通,结果发现Zend已经写了一个如何编写php extension的教程:
http://devzone.zend.com/article/1021-Extension-Writing-Part-I-Introduction-to-PHP-and-Zend
浏览完牛人的大作,更是信心十足,php的扩展其实很简单,分七步走:
1. 制作编译配置文件:config.m4
2. 执行phpize生成扩展的框架
3. 在生成的php_xxx.h中声明自己写的函数
4. 在xxx.c中实现自己的函数
5. 编译自己的扩展
6. 将生成的xxx.so拷贝到php.ini中指定的extensions_dir
7. 在php.ini中打开xxx.so的调用
此问题问题唯一搞的地方就是在config.m4中折腾出正确的Makefile,因为Zend的教程中没有提到,俺自己也折腾了好久,才搞出来。
二、实际操作
1.建立工作环境
将php源码包解开,我的版本的php-4.4.4,转到源码包中的ext目录建立一个新的目录叫icbc,然后在icbc目录下touch三个文件config.m4、php_icbc.h、icbc.c
2.建立config.m4 内容如下:
PHP_ARG_ENABLE(icbc, whether to enable ICBC support,
[ --enable-icbc Enable ICBC support])
if test \"$PHP_ICBC\" = \"yes\"; then
AC_DEFINE(HAVE_ICBC, 1, [Whether you have ICBC])
if test -f ./libicbcapi.a; then
PHP_ADD_LIBRARY_WITH_PATH(icbcapi, ./, ICBCAPI_SHARED_LIBADD)
PHP_SUBST(ICBCAPI_SHARED_LIBADD)
AC_MSG_RESULT(checking for libicbcapi.a is OK)
else
AC_MSG_RESULT(libicbcapi.a not found)
AC_MSG_ERROR(Please make sure the libicbcapi.a is in current directory) [Page]
fi
PHP_NEW_EXTENSION(icbc, icbc.c, $ext_shared)
fi
第三行判断是否要启用icbc扩展,
第五行判断ICBC的静态库是否在当前目录(phpdir/ext/icbc)下
第六、七行将ICBC的静态库加入到编译环境中
3.在php_icbc.h中声明我们要导出的函数icbc_sign、icbc_vsign、icbc_getCertID
#ifndef PHP_ICBC_H
#define PHP_ICBC_H
extern&nbs