资讯专栏INFORMATION COLUMN

PHP7扩展开发(二):配置项与全局数值

Mr_houzi / 1196人阅读

摘要:起步引擎提供了另种管理设置值的途径。假设我们需要为我们扩展定义一个值并用函数返回它的内容。在为了避免命名空间的冲突,我们扩展的名字作为所有值的前缀。仅仅是一种约定,一个句点用来分隔扩展名和说明性的初始设定名字。

起步

Zend引擎提供了另种管理设置值(INI)的途径。现在弄个简单的,我们经常看到php.ini里有诸如 display_errors = On 这样的全局设置。假设我们需要为我们扩展定义一个值: hello.greeting 并用函数 hello_ini() 返回它的内容。

在php.ini:

[hello]
hello.greeting=1

为了避免命名空间的冲突,我们扩展的名字作为所有值的前缀。仅仅是一种约定,一个句点用来分隔扩展名和说明性的初始设定名字。

声明变量 php_hello.h

ext_skel 工具初始化的扩展有个好处就是它能帮我们在特定的位置写上注释。

/*
    Declare any global variables you may need between the BEGIN
    and END macros here:

ZEND_BEGIN_MODULE_GLOBALS(hello)
    zend_long  global_value;
    char *global_string;
ZEND_END_MODULE_GLOBALS(hello)
*/

这是说如果我们需要声明全局变量,需要将放置在 BEBIN与END之间。并提供了示例,因此在这边添加:

ZEND_BEGIN_MODULE_GLOBALS(hello)
    zend_long greeting;
ZEND_END_MODULE_GLOBALS(hello)

ZEND_BEGIN_MODULE_GLOBALS()ZEND_END_MODULE_GLOBALS()用来创建一个名为zend_hello_globals的结构,它包含一个long型的变量。然后有条件地将HELLO_G()定义为从线程池中取得数值,或者从全局作用域中得到-如果你编译的目标是非多线程环境。

工具还为我生成了:

/* Always refer to the globals in your function as HELLO_G(variable).
   You are encouraged to rename these macros something shorter, see
   examples in any other php module directory.
*/
#define HELLO_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(hello, v)

#if defined(ZTS) && defined(COMPILE_DL_HELLO)
ZEND_TSRMLS_CACHE_EXTERN()
#endif

#endif

这是一个简化变量获取操作的宏设置,可以使用 HELLO_G(greeting) 来获得全局设置的变量。

源码实现 hello.c
/* {{{ PHP_INI
 */
/* Remove comments and fill if you need to have entries in php.ini
PHP_INI_BEGIN()
    STD_PHP_INI_ENTRY("hello.global_value",      "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_hello_globals, hello_globals)
    STD_PHP_INI_ENTRY("hello.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_hello_globals, hello_globals)
PHP_INI_END()
*/
/* }}} */

注释说明可以自己看一下,在这下方添加:

ZEND_DECLARE_MODULE_GLOBALS(hello)
    PHP_INI_BEGIN()
    STD_PHP_INI_ENTRY("hello.greeting","0", PHP_INI_ALL, OnUpdateLong, greeting, zend_hello_globals, hello_globals)
PHP_INI_END()

ZEND_DECLARE_MODULE_GLOBALS()宏来例示zend_hello_globals结构.初始值 "0" 是在php.ini里没有对应实体的时候生效的。

全局初始函数:

static void php_hello_init_globals(zend_hello_globals *hello_globals)
{
    //hello_globals->global_value = 0;
    //hello_globals->global_string = NULL;
}

php_hello_init_globals()实际上什么也没做,却得多声明个RINIT将变量greeting初始化为0,为什么?

关键在于这两个函数何时调用。php_hello_init_globals()只是在一个新的进程或线程时被调用;然而,每个进程都能处理多个请求,所以这个函数将变量初始化为0将只在第一个页面请求时运行。

接下来就是hello_ini()函数的实现了:

PHP_FUNCTION(hello_ini)
{
    RETURN_LONG(HELLO_G(greeting));
}

const zend_function_entry hello_functions[] = {
    PHP_FE(hello, NULL)
    PHP_FE(hello_ini, NULL) /*添加到编译中去*/
    PHP_FE(confirm_hello_compiled,  NULL)
    PHP_FE_END
};

一些诸如PHP_MINIT_FUNCTION也要修改,这些函数目前不知道作用是什么:

PHP_MINIT_FUNCTION(hello)
{
    REGISTER_INI_ENTRIES();
    return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(hello)
{
    UNREGISTER_INI_ENTRIES();
    return SUCCESS;
}
修改配置

写个hello_change_ini()来修改配置项:

PHP_FUNCTION(hello_change_ini)
{
    HELLO_G(greeting) ++;
}

同样要加到 hello_functions[] 中。

测试
";
echo hello_ini();    //2

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22066.html

相关文章

  • (PHP7内核剖析-11) 模块扩展

    摘要:编译工具这个脚本主要生成了编译需要的配置以及扩展的基本结构这个脚本主要是获取的安装信息用于生成文件编写扩展的基本步骤通过目录下脚本生成扩展的基本框架修改配置设置编译配置参数设置扩展的源文件依赖库函数检查等等定义一个这样的编译参数 1. 编译工具 (a).ext_skel:这个脚本主要生成了编译需要的配置以及扩展的基本结构 (b).php-config:这个脚本主要是获取PHP的安装信息...

    gplane 评论0 收藏0
  • PHP7扩展开发(三):参数、数组和Zvals

    摘要:告诉引擎要取的参数的信息,用来确保线程安全,返回值检测是还是。数组遍历假设我们需要一个取代以下功能的扩展的遍历数组和差很多,提供了一些专门的宏来遍历元素或。是一个关于线程安全的动作,用于避免各线程的作用域被其他的侵入。 起步 到这已经能声明简单函数,返回静态或者动态值了。定义INI选项,声明内部数值或全局数值。本章节将介绍如何接收从调用脚本(php文件)传入参数的数值,以及 PHP内核...

    hufeng 评论0 收藏0
  • 【天赢金创】PHP7与Swoole

    摘要:但在密集计算方面比等静态编译语言差几十倍甚至上百倍。一使用栈内存在引擎和扩展中,经常要创建一个的变量,底层就是一个指针。代码中创建的变量也进行了优化,直接在栈内存上预分配。应用层与底层在错误抛出的方式全部统一为异常。 原文:http://rango.swoole.com/archives/440最近PHP官方终于发布了传说中的PHP7,虽然只是alpha版。PHP7号称是新一代的PHP...

    MingjunYang 评论0 收藏0
  • Badoo 告诉你切换到 PHP7 节省了 100 万美元

    摘要:我们为了处理这些挑战,提出了一个新的引用测试框架当然,也是开源的,并且在整个过程中节省了上百万美元。另一方面,被证实有一些严重的缺点部署困难而且慢。在缓存刷新期间,当可用于别的进程的已缓存的文件字节码在此时损坏,就会导致崩溃。 How Badoo saved one million dollars switching to PHP7 我们成功的把我们的应用迁移到了php7上面(数百台机...

    biaoxiaoduan 评论0 收藏0
  • PHP5.5 ~ PHP7.2 新特性整理

    摘要:以上例程会输出返回值类型声明增加了对返回类型声明的支持。整数除法函数从移植到可为空类型参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。对于函数来说,不是一个合法的返回值。对于返回值,子类可以拓宽父类的或对象返回值类型到。 PHP5.5 ~ PHP7.2 新特性整理 官方文档:http://php.net/manual/zh/appe... 一、从PHP 5.5.x ...

    mrcode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<