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

articles from reage blog -- http://www.ireage.com