• 技术文章

    c++扩展PHP手记(一)

    终于有时间研究一下PHP的扩展开发,先来个简单的, 参考:http://my.huhoo.net/archives/2008/06/linuxcphp.html 使用ext_skel简单一些,也就是所谓的动态扩展,静态扩展没研究 首先找到PHP源码文件,找到ext下,然后步骤如下: 1,进入ext下,命令:   server:/data/soft/php/ext # ext_skel --extname = ext_bankie   然后可看到生成有ext_bankie.c/php_ext_bankie.h test文件夹,等等,但是最重要还是config.m4文件, 2,编辑config.m4 ,我的内容如下: if test "$PHP_EXT_BANKIE" != "no"; then PHP_REQUIRE_CXX() PHP_ARG_ENABLE(ext_bankie, whether to enable ext_bankie support, Make sure that the comment is aligned: [ --enable-ext_bankie Enable ext_bankie support]) PHP_ADD_LIBRARY(stdc++,"", EXTRA_LDFLAGS) PHP_NEW_EXTENSION(ext_bankie, ext_bankie.cpp, $ext_shared) fi 退出,config.m4说明: dnl 是注释; PHP_ARG_WITH 或者 PHP_ARG_ENABLE 指定了PHP扩展模块的工作方式,前者意味着不需要第三方库,后者正好相反; PHP_REQUIRE_CXX 用于指定这个扩展用到了C++; PHP_ADD_INCLUDE 指定PHP扩展模块用到的头文件目录; PHP_CHECK_LIBRARY 指定PHP扩展模块PHP_ADD_LIBRARY_WITH_PATH定义以及库连接错误信息等; PHP_ADD_LIBRARY(stdc++,””,EXTERN_NAME_LIBADD)用于将标准C++库链接进入扩展 PHP_SUBST(EXTERN_NAME_SHARED_LIBADD) 用于说明这个扩展编译成动态链接库的形式; PHP_NEW_EXTENSION 用于指定有哪些源文件应该被编译,文件和文件之间用空格隔开; 3,编辑php_ext_bankie.h, 由于TSRM.h这个文件所包含的函数和类都是用纯C语言写的,故应该使用extern来说明如下: 头部加入如下内容: extern "C" { #ifdef ZTS #include "TSRM.h" #endif } //这些有关函数的描述 PHP_MINIT_FUNCTION(ext_bankie); PHP_MSHUTDOWN_FUNCTION(ext_bankie); PHP_RINIT_FUNCTION(ext_bankie); PHP_RSHUTDOWN_FUNCTION(ext_bankie); PHP_MINFO_FUNCTION(ext_bankie);PHP_FUNCTION(confirm_ext_bankie_compiled); PHP_FUNCTION(strFun);//这个自己加入一个新函数,,但是没有成功,,稍后会给出原因             编辑完退出。 4,编辑ext_bankie.cpp,注意:ext_bankie.c 修改为ext_bankie.cpp 头部也需要加入: 21 #ifdef HAVE_CONFIG_H 22 #include "config.h" 23 #endif 24 extern "C"{ 25 #include "php.h" 26…

Free Web Hosting