nbsp;= verifySign(src,srclen,vcert,1525,vsignedbuf,vsignedbuflen) >= 0){
if(vsignedbuf != NULL) infosec_free(vsignedbuf);
RETURN_TRUE;
}else{
if(vsignedbuf != NULL) infosec_free(vsignedbuf);
RETURN_LONG(rcc);
}
}
PHP_FUNCTION(icbc_getCertID)
{
char* arg;
char* certid;
int arg_len,certidlen;
FILE* fp;
char cert[2000];
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"s\", &arg,&arg_len) == FAILURE){
return;
}
fp = fopen(arg,\"rb\");
if(fp == NULL)
{
return;
}
fread((void*)cert,1525,1,fp);
fclose(fp); [Page]
if(!getCertID(cert,1525,&certid,&certidlen))
{
arg = estrndup(certid,certidlen);
if(certid != NULL) infosec_free(certid);
RETURN_STRING(arg,1);
}else{
return;
}
}
先在zend_function_entry icbc_functions数组中放入我们的要实现的函数名,然后是一堆php各个状态入口函数,详情请看Zend的教程。最后是在PHP_FUNCTION宏定义中放我们声明函数的具体实现。具体实现时难点也就是参数的传入和结果传出,还好PHP已经为我们做了很好的抽象。在Zend的教程中也有详尽的说明,俺就不啰嗦了。关键代码照搬icbc的test.c就行了。
5.编译安装我们的库
先将ICBC的头文件考到当前目录,重命名为icbcapi.php,将静态库也cp过来,重命名为*nix的标准形式libicbcapi.a,然后运行
phpize
生成configure,运行
./configure --enable-icbc
生成Makefile,这里有一个很搞的地方,在生成的Makefile中最后一句中指定ICBC静态库的地方错了,正确的应该是(红色标记地方):
$(LIBTOOL) --mode=link $(CC) $(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) -o $@ -export-dynamic -avoid-version -prefer-pic -module -rpath $(phplibdir) $(EXTRA_LDFLAGS) $(shared_objects_icbc) $(ICBCAPI_SHARED_LIBADD)
改好Makefile后就可以执行
make
如果一切顺利的话会在modules中得到我们的icbc.so,将我们的icbc.so拷贝到/usr/local/lib/php/extensions目录下,然后在php.ini中确认extensions_dir的值是/usr/local/lib/php/extensions,然后加入