Linux下用C++开发PHP扩展

GOOGLE了很久,才发现一篇合适的... ◑﹏◐ 是C++写的PHP扩展!!!还是要记住:源代码版本一定要和你的开发环境一样!!! 步骤如下:
  1. 修改配置文件config.m4
  2. 先去掉PHP_ARG_ENABLE的三行注释,再在最后面 if结束前(FI)加上下面的代码
    PHP_REQUIRE_CXX()
    PHP_ADD_LIBRARY(stdc++, "", EXTRA_LDFLAGS)
    CPPFILE="extname.cpp"
    PHP_NEW_EXTENSION(cpptest,$CPPFILE, $ext_shared)
  3. 将源文件(extname.c文件)后缀改.cpp,再对头文件和源文件加 extern "C"{}
  4. 头文件:
    extern "C" {
    #ifdef ZTS
    #include "TSRM.h"
    #endif
    }
    源文件:
    extern "C" {
    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    
    #include "php.h"
    #include "php_ini.h"
    #include "ext/standard/info.h"
    }
  5. OK!搞定,运行:phpize -> ./configure -> make -> make install
——关于代码的编写 之前以为需要转换为Zend API的调用,还傻傻地看了《PHP扩展开发及内核应用》(Extending and Embedding PHP),虽然看了肯定有好处。 如果你已经写好了cpp代码,直接给出个接口就可以了!这个是无意中加了个非PHP_FUNCTION(foo),发现能直接用,所以就只需要接收php传入的参数即可... 接收参数方法: 用zend_parse_parameters()函数 其中,接收字符串一定要同时把字符串的长度也接收了,如接收2个字符串参数
    char *argv1= NULL ;
    char *argv2= NULL ; 
    int arg1_len, arg2_len; 
        
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &argv1, &arg1_len,&argv2,&arg2_len) == FAILURE) 
    {
		return;
     }
解释一下参数的意思:
  1. 第一个参数: ZEND_NUM_ARGS()表示自动获取参数个数(有多少拿多少), 后面跟着的 TSRMLS_CC是为了线程安全
  2. 第二介参数:"ss":表示接收两个字符串参数,如果3个就"sss",其他的int-- "l",double-- "d" 等 。对字符串,接收的同学一定要把字符串的长度也接收了!
  3. 后面的n个参数就是存放的变量,和scanf("%d",a)很像,但字符串就是还是把字符串长度放在字符串变量后面。
返回值: RETURN_XXX : XXX表示LONG,DOUBLE
posted @ 2012-04-26 10:06  ifeixiang  阅读(3114)  评论(0编辑  收藏  举报