GOOGLE了很久,才发现一篇合适的... ◑﹏◐
是C++写的PHP扩展!!!还是要记住:源代码版本一定要和你的开发环境一样!!!
步骤如下:
- 修改配置文件config.m4
先去掉PHP_ARG_ENABLE的三行注释,再在最后面 if结束前(FI)加上下面的代码
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, "", EXTRA_LDFLAGS)
CPPFILE="extname.cpp"
PHP_NEW_EXTENSION(cpptest,$CPPFILE, $ext_shared)
- 将源文件(extname.c文件)后缀改.cpp,再对头文件和源文件加 extern "C"{}
头文件:
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"
}
- 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;
}
解释一下参数的意思:
- 第一个参数: ZEND_NUM_ARGS()表示自动获取参数个数(有多少拿多少), 后面跟着的 TSRMLS_CC是为了线程安全
- 第二介参数:"ss":表示接收两个字符串参数,如果3个就"sss",其他的int-- "l",double-- "d" 等 。对字符串,接收的同学一定要把字符串的长度也接收了!
- 后面的n个参数就是存放的变量,和scanf("%d",a)很像,但字符串就是还是把字符串长度放在字符串变量后面。
返回值:
RETURN_XXX : XXX表示LONG,DOUBLE