PHP扩展开发教程,通过实例来展示PHP的扩展开发和底层应用原理(C语言非zephir)

主要是使用C语言来开发PHP扩展,现在的案例正在一步一步完善中,希望有兴趣的朋友一起来加入和完善,现在已经完成的案例如下:

Dicretory Explain
hello_word php hello word extension
widuu php ini settings and read php ini configure
w_string php returning values

Contributing

  1. 登录 https://github.com
  2. 仓库地址分布 http://github.com/widuu/php_ext
  3. 创建您的特性分支 (git checkout -b my-new-feature)
  4. 提交您的改动 (git commit -am 'Added some feature')
  5. 将您的改动记录提交到远程 git 仓库 (git push origin my-new-feature)
  6. 然后到 github.com 网站的该 git 远程仓库的 my-new-feature 分支下发起 Pull Request

下边是INI的小扩展代码片段

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_widuu.h"


ZEND_DECLARE_MODULE_GLOBALS(widuu)



const zend_function_entry widuu_functions[] = {
    PHP_FE(read_ini,    NULL)       
    PHP_FE_END  
};

zend_module_entry widuu_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    "widuu",
    widuu_functions,
    PHP_MINIT(widuu),
    PHP_MSHUTDOWN(widuu),
    NULL,       
    NULL,       
    PHP_MINFO(widuu),
#if ZEND_MODULE_API_NO >= 20010901
    PHP_WIDUU_VERSION,
#endif
    STANDARD_MODULE_PROPERTIES
};


#ifdef COMPILE_DL_WIDUU
ZEND_GET_MODULE(widuu)
#endif


PHP_INI_BEGIN()
    STD_PHP_INI_ENTRY("widuu.enable",      "1", PHP_INI_ALL, OnUpdateBool, enable, zend_widuu_globals, widuu_globals)
    STD_PHP_INI_ENTRY("widuu.size",      "42", PHP_INI_ALL, OnUpdateLong, size, zend_widuu_globals, widuu_globals)
    STD_PHP_INI_ENTRY("widuu.name", "widuu", PHP_INI_ALL, OnUpdateString, name, zend_widuu_globals, widuu_globals)
PHP_INI_END()


PHP_MINIT_FUNCTION(widuu)
{

    REGISTER_INI_ENTRIES();

    return SUCCESS;
}
/* }}} */

/* {{{ PHP_MSHUTDOWN_FUNCTION
 */
PHP_MSHUTDOWN_FUNCTION(widuu)
{

    UNREGISTER_INI_ENTRIES();

    return SUCCESS;
}
/* }}} */


/* {{{ PHP_MINFO_FUNCTION
 */
PHP_MINFO_FUNCTION(widuu)
{
    php_info_print_table_start();
    php_info_print_table_header(2, "widuu support", "enabled");
    php_info_print_table_row(2 , "author", "widuu " );
    php_info_print_table_end();

    DISPLAY_INI_ENTRIES();
}
/* }}} */

PHP_FUNCTION(read_ini){
    char *str,*varname;
    int str_len;

    if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s" ,&varname,&str_len) == FAILURE){
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "don't exists parameter");
        return;
    }
    str = zend_ini_string(  varname, str_len+1, 0 );

    if (!str) {
        RETURN_FALSE;
    }

    RETURN_STRING( str , 1);
    // str = zend_ini_string("widuu.name", sizeof("widuu.name"), 0);
    //  long maxwait = zend_ini_long("widuu.size",  sizeof("widuu.size"), 0);
    // if (str == NULL) {
    //  php_error_docref("widuu.size", E_WARNING, "config not exists");
    // }
    // printf("%s\n",str );
    // printf("%d\n", maxwait );
    // if (name != NULL){
    //  printf("%s\n", name);
    // }
    // RETURN_FALSE;

}

函数 string read_ini(string parameter);

echo read_ini('widuu.name');

你可能感兴趣的:(php扩展开发,zend-api,c,php)