社区
基础编程
帖子详情
linux下开发库函数供php调用问题
thomas
2000-08-28 10:11:00
请问如何在linux下用c开发库函数,供php下调用
请问如何开发,php如何调用
...全文
76
回复
打赏
收藏
linux下开发库函数供php调用问题
请问如何在linux下用c开发库函数,供php下调用 请问如何开发,php如何调用
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
开发
PHP
扩展详细教程
如果用
PHP
不能再满足你的需求,最好的办法就是
开发
PHP
扩展。这有一些好处: 1、增加自己的特殊功能。 2、保护自己的专利代码。 这是几年前的一篇英文文章,现在已被翻译成中文版的。 作者应该是hshq_cn。 链接是:http://bbs3.chinaunix.net/thread-1028798-1-1.html。 现我将此转变为PDF文件,仅有兴趣者参阅。同时非常感谢 原作者及hshq_cn,给我们带来的这么好的资料。里面还有一个幻灯片的,也是很有帮助的文档。另外,再提
供
一篇相关的文章(http://www.programbbs.com/doc/4083.htm): 编写
php
的extension实例的方法 所属类别:JSP 推荐指数:★★☆ 文档人气:161 本周人气:1 发布日期:2008-7-3 一、说明 前端时间因为客户的原因折腾了一下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. 执行
php
ize生成扩展的框架 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的静态库是否在当前目录(
php
dir/ext/icbc)下 第六、七行将ICBC的静态库加入到编译环境中 3.在
php
_icbc.h中声明我们要导出的函数icbc_sign、icbc_vsign、icbc_getCertID #ifndef
PHP
_ICBC_H #define
PHP
_ICBC_H extern zend_module_entry icbc_module_entry; #define
php
ext_icbc_ptr &icbc_module_entry #ifdef
PHP
_WIN32 #define
PHP
_ICBC_API __declspec(dllexport) #else #define
PHP
_ICBC_API #endif #ifdef ZTS #include \"TSRM.h\" #endif
PHP
_MINIT_FUNCTION(icbc);
PHP
_MSHUTDOWN_FUNCTION(icbc);
PHP
_RINIT_FUNCTION(icbc);
PHP
_RSHUTDOWN_FUNCTION(icbc);
PHP
_MINFO_FUNCTION(icbc); /*Modify youself here*/
PHP
_FUNCTION(icbc_sign);
PHP
_FUNCTION(icbc_vsign);
PHP
_FUNCTION(icbc_getCertID); /****End of Self control section***/ #ifdef ZTS #define ICBC_G(v) TSRMG(icbc_globals_id, zend_icbc_globals *, v) #else #define ICBC_G(v) (icbc_globals.v) #endif #endif /*
PHP
_ICBC_H */ 涉及到我们也就
PHP
_FUNCTION(icbc_sign);
PHP
_FUNCTION(icbc_vsign);
PHP
_FUNCTION(icbc_getCertID); 其他的都是
PHP
各个状态的入口函数声明 4.编写这三个函数的实现: #ifdef HAVE_CONFIG_H #include \"config.h\" #endif #include \"
php
.h\" #include \"
php
_ini.h\" #include \"ext/standard/info.h\" #include \"
php
_icbc.h\" #include \"icbcapi.h\" static int le_icbc; zend_function_entry icbc_functions[] = {
PHP
_FE(icbc_sign,NULL)
PHP
_FE(icbc_vsign,NULL)
PHP
_FE(icbc_getCertID,NULL) {NULL, NULL, NULL} /* Must be the last line in icbc_functions[] */ }; zend_module_entry icbc_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif \"icbc\", icbc_functions,
PHP
_MINIT(icbc),
PHP
_MSHUTDOWN(icbc),
PHP
_RINIT(icbc), /* Replace with NULL if there’s nothing to do at request start */
PHP
_RSHUTDOWN(icbc), /* Replace with NULL if there’s nothing to do at request end */ [Page]
PHP
_MINFO(icbc), #if ZEND_MODULE_API_NO >= 20010901 \"0.1\", /* Replace with version number for your extension */ #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_ICBC ZEND_GET_MODULE(icbc) #endif
PHP
_MINIT_FUNCTION(icbc) { return SUCCESS; }
PHP
_MSHUTDOWN_FUNCTION(icbc) { return SUCCESS; }
PHP
_RINIT_FUNCTION(icbc) { return SUCCESS; }
PHP
_RSHUTDOWN_FUNCTION(icbc) { return SUCCESS; }
PHP
_MINFO_FUNCTION(icbc) {
php
_info_print_table_start();
php
_info_print_table_header(2, \"icbc support\", \"enabled\");
php
_info_print_table_end(); }
PHP
_FUNCTION(icbc_sign) { char* src; int srclen; char* pkey; int keylen; char* keypass; int keypasslen; char* signedbuf; int signedbuflen; FILE* fp; char key[2000]; int rcc; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"sss\",&src,&srclen,&pkey,&keylen,&keypass,&keypasslen) == FAILURE){ return; } fp = fopen(pkey,\"rb\"); if(fp == NULL) { return; } fseek(fp,2,SEEK_SET); fread((void*)key,609,1,fp); fclose(fp); if(rcc = sign(src,srclen,key,607,keypass,&signedbuf,&signedbuflen) >= 0){ base64enc(signedbuf,signedbuflen,&signedbuf,&signedbuflen); src = estrndup(signedbuf,signedbuflen); if(signedbuf != NULL) infosec_free(signedbuf); RETURN_STRING(src,1); [Page] }else{ RETURN_LONG(rcc); } }
PHP
_FUNCTION(icbc_vsign) { char* src; int srclen; char* cert; int certlen; char* vsignedbuf; int vsignedbuflen; FILE* fp; char vcert[2000]; int rcc; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,\"sss\",&src,&srclen,&cert,&certlen,&vsignedbuf,&vsignedbuflen) == FAILURE){ return; } fp = fopen(cert,\"rb\"); if(fp == NULL) { return; } fread((void*)vcert,1525,1,fp); fclose(fp); base64dec(vsignedbuf,vsignedbuflen,&vsignedbuf,&vsignedbuflen); if(rcc = 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,然后运行
php
ize 生成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 $(
php
libdir) $(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,然后加入这句话 extension=icbc.so 重启apache后,就可以在
php
中直接
调用
这三个函数了 6.测试程序,要将测试的证书和key文件放到
php
测试文件的当前目录
php
$realpath = dirname(__FILE__); $key = $realpath.\"/user.key\"; $cert = $realpath.\"/user.crt\"; $src = \"zzz\"; $passwd = \"12345678\"; echo \"The Cert file information is \"; echo icbc_getCertID($cert); echo \"
\"; $b64sdata = icbc_sign($src,$key,$passwd); echo \"The string \".$src.\" encrypt by icbc api is \".$b64sdata.\"(base64 encoded)
\"; echo \"Now we check it weather is correct....
\"; if(icbc_vsign(\"zzz\",$cert,$b64sdata)){ echo \"The signtrue to \".$src.\" is right!!
\"; [Page] }else{ echo \"The signtrue to \".$src.\" is wrong!!
\"; exit(); } ?>
基于C++的基本库实现了SIFT特征提取与匹配, 无需
调用
如OpenCV的
库函数
. 从实现细节的角度介绍了SIFT算.zip
【项目资源】: 包含前端、后端、移动
开发
、操作系统、人工智能、物联网、信息化管理、数据库、硬件
开发
、大数据、课程资源、音视频、网站
开发
等各种技术项目的源码。 包括STM32、ESP8266、
PHP
、QT、
Linux
、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的
问题
,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。
linux
中的文件IO-3.1.
linux
应用编程和网络编程第1部分
本课程主要讲解
linux
中的文件读写和IO处理,包括API的概念、open函数的重要flag、
linux
内核管理文件的原理、inode和vnode、文件共享、标准IO等。终目的是让大家理解并掌握在
linux
中使用API和
库函数
进行文件操作的一般方法。
MingW VC 之.a .lib .dll .def 关系
MSVC vs. MinGW 之 (lib,dll,def,obj,exe) vs (a,dll,def,o,exe) 玩转攻略手记 一份粗糙的研究记录,有待补完和整理。 MinGW: c -> o gcc -c a.c c -> exe gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a.exe) o -> exe gcc a.o b.o ... -o main.exe c -> dll,def,a gcc a.c -shared -o a.dll -Wl,--output-def,a.def,--out-implib,liba.a a -> dll a2dll liba.a dll -> a: dlltool --dllname a.dll --def a.def --output-lib liba.a (需要def文件) a -> def: dumpbin /exports lib.a > lib.def (在windows上
调用
,def需要修改) dll -> def : pexports a.dll -o > a.def (这里的-o是指给函数标序号) lib -> def : reimp -d a.lib lib -> a: (for __cdecl functions in most case) reimp a.lib; (for __stdcall functions) MSVC: c -> lib cl /LD a.c (注意已经定义了export列表) c -> dll cl /LD a.c c -> obj cl /c a.c c -> exe cl a.c /out:a.exe dll ->lib lib /machine:ix86 /def:a.def /out:a.lib (需要def文件) obj ->lib lib a.obj b.obj... /out:mylib.lib dll ->def DUMPBIN a.dll /EXPORTS /OUT:a.def (生成的def需要做修正) lib ->def reimp -d a.lib (这个要在MSYS+MinGW下用) 关于这些工具的适用范围可以很容易的理解和记忆。 dll和exe都是PE文件,所以可以使用pexports. lib和a是静态库文件,都是归档类型,不是PE格式。所以不能使用pexports. dll可以使用dlltool. lib可以使用lib, 和reimp(lib->a工具) 所有的bin文件,包括dll,exe,lib,a都可以使用dumpbin. 参考: http://hi.baidu.com/kaien_space/blog/item/5e77fafa2ba9ff16a8d3110a.html Mingw官网文档: http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs http://oldwiki.mingw.org/index.
php
/CreateImportLibraries http://www.mingw.org/wiki/FAQ http://hi.baidu.com/opaquefog/blog/item/9b21b6deb324e25dccbf1ab7.html http://qzone.qq.com/blog/8330936-1238659272 http://hi.baidu.com/jzinfo/blog/item/b0aa1d308de99f9da8018e00.html 本篇测试用代码: 1. main.cpp #include #include #include "mylib.h" using namespace std; int main() { char str[]="Hello world!"; printhello(str); return 0; } 2. mylib.cpp #include #include #include "mylib.h" using namespace std; void EXPORT printhello(char *str) { cout << str << endl; } 3. mylib.h #define EXPORT __declspec(
C程序设计语言(第2版·新版中文)
《C程序设计语言》(第2版新版)讲述深入浅出,配合典型例证,通俗易懂,实用性强,适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件
开发
的技术人员的参考书。《C程序设计语言》(第2版新版)原著即为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的一本介绍C语言的权威经典著作。我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。人们熟知的“hello,world”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。 内容提要 -------------------------------------------------------------------------------- 《C程序设计语言》(第2版新版)是由C语言的设计者Brian W.Kernighan和Dennis M.Ritchie编写的一部介绍标准C语言及其程序设计方法的权威性经典著作。全面、系统地讲述了C语言的各个特性及程序设计的基本方法,包括基本概念,类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口、标准库等内容。 目录 出版者的话 专家指导委员会 中文版序 译者序 校译者简介 序 第1版序 引言 第1章 导言 1.1 入门 1.2 变量与算术表态式 1.3 for语句 1.4 符号常量 1.5 字符输入/输出 1.6 数组 1.7 函数 1.8 参数——传值
调用
1.9 字符数组 1.10 外部变量与作用域 第2章 类型、运算符与表达式 2.1 变量名 2.2 数据类型及长度 2.3 常量 2.4 声明 2.5 算术运算符 2.6 关系运算符与逻辑运算符 2.7 类型转换 2.8 自增运算符与自减运算符 2.9 按位运算符 2.10 赋值运算符与表达式 2.11 条件表达式 2.12 运算符优先级与求值次序 第3章 控制流 3.1 语句与程序块 3.2 if-else语句 3.3 else-if语句 3.4 switch语句 3.5 whil循环与for特环 3.6 do-while循环 3.7 break语句与continue语句 3.8 goto语句与标号 第4章 涵数与程序结构 第5章 指针与数组 第6章 结构 第7章 输入与输出 第8章 UNIX系统接口 附录A 参考手册 附录B 标准库 附录C 变更小结 索引 作者介绍 -------------------------------------------------------------------------------- Brian W.Kernighan贝尔实验室计算科学研究中心高级研究人员,著名的计算机科学家。他参加了UNIX系统、C语言、AWK语言和许多其他系统的
开发
,同时出版了许多在计算机领域具有影响的著作,如《The C Proguamming Language》、《The Elementsof Programming Style》等。 推荐资源 C# 编程实例与技巧 C 程序
开发
经典实例之一.doc windows程序设计第五版(中文版) 贪吃蛇 游戏 C++ C# 程序
开发
范例宝典(第二版) 源代码 20~21 C、C++面试题大全 Java程序员就业面试大全 程序员面霸手册(笔试面试的葵花宝典) visual c++6.0应用编程150例源代码 经典的经典C#经典面试题 作者其他资源编程大讲坛:C语言核心
开发
技术从入门到精通(光盘代码) C语言
库函数
功能查询器(绿色版) 共有评论81条 hua5040发表的评论 学习,收藏。。。 时间:2010-10-22 18:09:48 来自:58.60.231.* chenshanmeizhu发表的评论 bucuo hen nanzhao 时间:2010-10-18 11:04:36 来自:116.228.2.* llf_17发表的评论 很好的书,经典 时间:2010-10-17 19:21:45 来自:221.12.174.* jujyter发表的评论 绝对的c中经典 时间:2010-10-17 16:36:25 来自:115.25.169.* z_free发表的评论 学习 学习 看看 时间:2010-10-17 10:11:32 来自:221.212.116.*共81个 下一页 发表评论现在有81人对本文发表评论 热门Tag JAVA C++
linux
C# 教程 C语言 android 源码 PDF 编程 sql c Windows matlab ORACLE 源代码 api 中文 数据库 arm JavaScript 破解 数据结构 vc visual jQuery 计算机 答案 单片机
php
JSP mfc .NET 中文版 VB 本周热点资源 C、C++面试题大全 嵌入式
Linux
系统
开发
技术详解--基于ARM(完整版) 程序员面霸手册(笔试面试的葵花宝典) visual c++6.0应用编程150例源代码 Dom文档对象模型-2010版
linux
的内核及其内核源码分析1 嵌入式系统的C程序设计 Java程序员就业面试大全 经典的经典C#经典面试题 C、C++ 网络通讯笔试题大全
linux
的内核及其内核源码分析2 嵌入式系统的内核引导启动过程浅析
linux
的内核及其内核源码分析U-Boot PoorSakura vol.4 中文补丁(雯雅婷4 汉化补丁) 嵌入式系统构件基于arm sqlserver2005技术内幕:t-sql程序设计part1(中文完整版分4份下) C# 编程实例与技巧 本周上传用户排名 122个star20100906 43个aa3323036 28个sai5201314vicky 28个ltx0724 26个fengboss2010 23个zhoulei3862422 20个lghndyz 19个melody9758 19个qks123 19个DoomLord 17个afd_326 16个yuxuanmoge 16个bianchdaiw 16个muddy12345 15个zk6010 15个yosen 15个lleheaven 公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|
问题
报告北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号世纪乐知(北京)网络技术有限公司 提
供
技术支持江苏乐知网络技术有限公司 提
供
商务支持 Email:webmaster@csdn.netCopyright © 1999-2010, CSDN.NET, All Rights Reserved
基础编程
21,886
社区成员
140,364
社区内容
发帖
与我相关
我的任务
基础编程
从PHP安装配置,PHP入门,PHP基础到PHP应用
复制链接
扫一扫
分享
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章