这两天一直在开发PHP扩展,写了一个微信的扩展应用,好多朋友一直在问,如何写扩展,这里我就介绍一下,也是因为这两天公司忙,博客没怎么更新,Docker 也没更新 抱歉了。

前提

  1. 一台 LINUX 主机( windows也可以,可以看我前边的文档 windows 开发 php 扩展 )
  2. 官网下载 php 源码 ( windows 复杂点,前边有文档,php5.5 以下记得是vc9)
  3. 要会C语言,查看一下ZEND API

开发

Linux 举例开发,将下载好的php解压到一个目录,譬如我的mac目录是 ~/php/phpcode

cd ~/php/phpcode/ext
./ext_skel --extname=hello  //这里我们假设开发一个 hello 的扩展

编写代码 php_hello.h ,在 PHP_FUNCTION(confirm_hello_compiled); 后加一个函数

PHP_FUNCTION(hello);

编写代码 hello.c, PHP_FE(confirm_hello_compiled, NULL) 后加一行

PHP_FE(hello,   NULL)

然后,你可以在PHP_FUNCTION(confirm_widuu_compiled) 后定义一个函数,代码如下

PHP_FUNCTION(hello){
    php_printf("hello word");
}

在修改 config.m4 中的文件,去除这三行文件前边的dnl,如下效果

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[  --enable-hello           Enable hello support]) 

命令行,执行

path/phpize && ./configure && make

最后测试

cd modules && php -d extension=hello.so -r "hello();"

输出 hello word

可以这样

当然如果你比较熟悉的话,你可以跟我一样,直接建立一个文件夹手写,如下代码 hello.c

/**
 * @author widuu <admin@widuu.com>
 */

// 必须包含的 PHP 头文件 
#include "php.h"

/**
 * 模块介绍
 */

#define PHP_HELLO_EXTNAME "hello"
#define PHP_HELLO_VERSION "0.0.1"

/**
 * 定义 hello 方法必须包含的一个参数
 * function hello (string name)
 */

ZEND_BEGIN_ARG_INFO(hello_arginfo,0)
    ZEND_ARG_INFO(0,name)
ZEND_END_ARG_INFO()

/**
 * hello 函数
 */

static PHP_FUNCTION(hello){
    char *name;
    int  name_len;
    //参数大于1 报错
    if( ZEND_NUM_ARGS()>1 ){
        WRONG_PARAM_COUNT;
    }

    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE){
        return;
    }

    RETURN_STRINGL(name,name_len,0);
}

/**
 * 函数 API 列表
 */

static zend_function_entry hello_functions[] = {
    PHP_FE(hello,   hello_arginfo)      /* hello 方法 */
    PHP_FE_END  /* Must be the last line in hello_functions[] */
};

/**
 * phpinfo 信息
 */

PHP_MINFO_FUNCTION(hello)
{
    php_info_print_table_start();
    php_info_print_table_header(2, "hello support", "enabled");
    php_info_print_table_row(2, "Version", PHP_HELLO_VERSION);
    php_info_print_table_end();
}

/**
 * 模块信息
 */

zend_module_entry hello_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    PHP_HELLO_EXTNAME,
    hello_functions,
    NULL,
    NULL,
    NULL,       
    NULL,   
    PHP_MINFO(hello),
#if ZEND_MODULE_API_NO >= 20010901
    PHP_HELLO_VERSION,
#endif
    STANDARD_MODULE_PROPERTIES
};


ZEND_GET_MODULE(hello)

config.m4 内容如下

PHP_ARG_ENABLE(hello, 
    whether to enable Hello extension, 
[ --enable-hello-php Enable Hello extension])
if test "$PHP_HELLO" != "no"; then
PHP_NEW_EXTENSION(hello, hello.c, $ext_shared)
fi

安装方法是一样的。

好今天就到这,然后后边我也会带大家用 zephir 重写微信模块。因为那个不需要 C 语言基础。更多问题,可以去社区 www.weiduyun.com 提问。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部