php extensions(-) 代码目录结构
php extensions(-) 代码目录结构
引言
每一个php extension的目录中最少要包含config.m4、config.w32、php_extension.h、extension.c。php_extension.h和extension.c文件是以后编写php extension主要用到文件,这里就不介绍了。下面我们开一个叫reage的php extension。
1. 扩展的配置文件config.m4和config.w32
config.m4用户Unix、Linux等系统。config.m4文件告诉 UNIX 构建系统哪些扩展 configure 选项是支持的,你需要哪些扩展库,以及哪些源文件要编译成它的一部分。
config.m4配置函数PHP_ARG_WITH()和 PHP_ARG_ENABLE()的区别在于编译的时候使用 --with-* 选项还是 --enable-* 。
下面是我的一个例子
dnl在config.m4是注释的意思
PHP_ARG_WITH(reage, for reage support,
Make sure that the comment is aligned:
[ --with-reage Include reage support])
dnl 检测扩展是否已启用
if test $PHP_REAGE != "no"; then
PHP_SUBST(REAGE_SHARED_LIBADD)
PHP_NEW_EXTENSION(reage, reage.c, $ext_shared)
fi
config.w32 是windows下的扩展的配置文件的,具体使用查看
####2. php_reage.h
php_reage.h其实不是必须的,但是一般的都C语言项目都是包含.h和.c文件的。为了让代码看起来更加的正规,我们也使用.h文件。.h文件一般只包含函数的定义、结构体的定义。
下面是我的一个例子:
#ifndef REAGE_H
#define REAGE_H
#include "php.h"
#define phpext_reage_ptr &reage_module_entry;
extern zend_module_entry reage_module_entry;
#endif
####3. reage.c reage.c是具体的代码文件的。 下面是我的一个例子:
#include "php_reage.h"
#include "ext/standard/info.h"
//加载config.h,如果有配置项
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
//module entry
zend_module_entry reage_module_entry = {
STANDARD_MODULE_HEADER,
"reage",//扩展的名字
NULL, // functions
NULL, // minit
NULL, //mshutdown
NULL, //rinit
NULL, //rshutdown
NULL,
"0.0.1", //版本号
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_REAGE
ZEND_GET_MODULE(reage)
#endif
####4. 编译php extension 在php extension的目录下,执行一下命名:
1. phpize
2. ./configure
3. make
4. make test
####5. test 将modules/reage.so 拷贝到你php的extension路径中。不知道路径的话,看下phpinfo()中extension_dir的值就可以了。然后修改php.ini添加extension=reage.so。如果没有问题,在phpinfo()中会现实reage及其版本。
####6. ext_skel ext_skel工具是专门用来生成php extension 目录结构的。ext_skel在php源码下的ext目录下。 使用ext_skel工具生成目录结构后,需要修改config.m4中大约10-20行,是关于PHP_ARG_WITH和PHP_ARG_ENABLE的。根据自己的需要将前面的注释符号(dnl)去掉
####7. 源代码 https://github.com/rentiansheng/php-extension-learn/tree/master/learn1