首先自然需要下载php的源码程序,这里本地用的测试是php5.6版本的
wget http://cn2.php.net/distributions/php-5.6.36.tar.gz
tar -xzvf php-5.6.36.tar.gz
cd php-5.6.36
./configure --prefix=/root/php/ --enable-debug --enable-maintainer-zts
make
make test
make clean
编译如果没有问题的话,就ok了。下面就可以开始写扩展了,为了方便,这里直接把测试的扩展写在扩展目录下面
cd php-5.6.36/ext
mkdir rain
cd rain
先写好相应的config.m4 文件具体代码如下
PHP_ARG_ENABLE(rain,
[Whether to enable the "rain" extesion],
[enable-rain Enable "rain" extesion support])
if test $PHP_RAIN != "no"; then
PHP_SUBST(RAIN_SHARED_LIBADD)
PHP_NEW_EXTENSION(rain, rain.c, $ext_shared)
fi
PHP_ARG_ENABLE接受三个参数,第一个是指定扩展的名称,第二个是扩展configure的时候的输出内容,第三个是configure –help的输出内容
$PHP_RAIN 在扩展被启用的时候,值会变成yes,所以这里有一个if的判断逻辑
另外说一下 –with-extname和 –enable-extname的区别,主要的区别在于–enable-extname通常指的是不依赖第三方类库,–with-extname通常是指依赖第三方类库的扩展
PHP_SUBST 是AC_SUBST的一个封装而已
PHP_NEW_EXTENSION 第一个参数是扩展的名称,第二个参数是扩展需要的源文件,如果是多个文件使用空格隔开就行,第三个参数是扩展的编译方式
$ext_shared 用来指明扩展不是静态编译进去的,而是运行的时候,动态加载的
写好了config.m4文件,接下来,写一个简单的hello world的php扩展demo,先写一个c的头文件,这里假定为 php_rain.h 里面的内容如下
#ifndef RAIN_H
#define RAIN_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#define phpext_rain_ptr &rain_module_entry
extern zend_module_entry rain_module_entry;
#endif
然后再写一个具体实现的c的源文件,这里假定为文件名称是 rain.c 里面的内容如下
#include "php_rain.h"
ZEND_FUNCTION(rain_hello)
{
php_printf("Hello World, Rain\n");
}
static zend_function_entry rain_functions[] = {
ZEND_FE(rain_hello, NULL)
{NULL, NULL, NULL}
};
zend_module_entry rain_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"rain",
rain_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
#if ZEND_MODULE_API_NO >= 20010901
"1.0",
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_RAIN
ZEND_GET_MODULE(rain)
#endif
然后我们就可以进行编译了,编译自己写的测试扩展,和编译普通扩展类似,直接通过 phpize来初始化生成configure文件,然后通过运行configure 和make 以及make install来进行安装扩展,然后我们在php.ini中启用扩展就可以了。然后可以通过
php -r "rain_hello();"
来查看我们的扩展是否可以正常的运行起来