加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php的INI设置

发布时间:2013-09-14 18:41:24 所属栏目:PHP教程 来源:站长网
导读:INI设置 和上一章你看到的超级全局变量以及持久化常量一样, php.ini值必须在扩展的MINIT代码块中定义. 然而, 和其他特性不同的是, INI选项的定义仅仅由简单的启
INI设置

和上一章你看到的超级全局变量以及持久化常量一样, php.ini值必须在扩展的MINIT代码块中定义. 然而, 和其他特性不同的是, INI选项的定义仅仅由简单的启动/终止线组成.

PHP_MINIT_FUNCTION(sample4)  
{  
    REGISTER_INI_ENTRIES();  
    return SUCCESS;  
}  
PHP_MSHUTDOWN_FUNCTION(sample4)  
{  
    UNREGISTER_INI_ENTRIES();  
    return SUCCESS;  
}

定义并访问INI设置

INI指令自身是在源码文件中MINIT函数上面, 使用下面的宏完全独立的定义的, 在这两个宏之间可以定义一个或多个INI指令:

PHP_INI_BEIGN()  
PHP_INI_END()

这两个宏函数和ZEND_BEGIN_MODULE_GLOBALS()/ZEND_END_MODULE_GLOBALS()异曲同工. 不过这里不是typdef一个结构体, 而是对静态数据实例定义的框架组织:

static zend_ini_entry ini_entries[] = {  
{0,0,NULL,0,NULL,NULL,NULL,NULL,NULL,0,NULL,0,0,NULL} };

如你所见, 它定义了一个zend_ini_entry值的向量, 以一条空的记录结束. 这和你在前面看到的静态向量function_entry的定义一致.

简单的INI设置

现在, 你已经有一个INI结构体用于定义INI指令, 以及引擎注册/卸载INI设置的机制, 因此我们可以真正的去为你的扩展定义一些INI指令了. 假设你的扩展暴露了一个打招呼的函数, 就像第5章"你的第一个扩展"中一样, 不过, 你想让打招呼的话可以自定义:

PHP_FUNCTION(sample4_hello_world)  
{  
    php_printf("Hello World!n");  
}

最简单最直接的方式就是定义一个INI指令, 并给它一个默认值"Hello world!":

#include "php_ini.h"  
PHP_INI_BEGIN()  
    PHP_INI_ENTRY("sample4.greeting", "Hello World",  
                                    PHP_INI_ALL, NULL)  
PHP_INI_END()

你可能已经猜到了, 这个宏的前两个参数表示INI指令的名字和它的默认值. 第三个参数用来确定引擎是否允许这个INI指令被修改(这将涉及到本章后面要介绍的访问级别问题). 最后一个参数是一个回调函数, 它将在每次INI指令的值发生变化时被调用. 你将在修改事件一节看到这个参数的细节.

译注: 如果你和译者一样遇到结果和原著结果预期不一致时, 请在测试时, 在你的MINIT()函数中增加一句"REGISTER_INI_ENTRIES();"调用, 并确保该调用在你的MINIT中分配全局空间之后执行.

现在你的INI设置已经定义, 只需要在你的打招呼函数中使用就可以了.

PHP_FUNCTION(sample4_hello_world)  
{  
    const char *greeting = INI_STR("sample4.greeting");  
    php_printf("%sn", greeting);  
}

一定要注意, char *的值是引擎所有的, 一定不要修改. 正因为这样, 所以将你本地用来临时存储INI设置值的变量定义为const修饰. 当然, 并不是所有的INI值都是字符串; 还有其他的宏用来获取整型, 浮点型以及布尔型的值:

long lval = INI_INT("sample4.intval");  
double dval = INI_FLT("sample4.fltval");  
zend_bool bval = INI_BOOL("sample4.boolval");

通常你想要知道的是INI设置的当前值; 不过, 作为补充, 存在几个宏可以用来读取未经修改的INI设置值:

const char *strval = INI_ORIG_STR("sample4.stringval");  
long lval = INI_ORIG_INT("sample4.intval");  
double dval = INI_ORIG_FLT("sample4.fltval");  
zend_bool bval = INI_ORIG_BOOL("sample4.boolval");

这个例子中, INI指令的名字"sample4.greeting"增加了扩展名作为前缀, 这样来保证不会和其他扩展暴露的INI指令名字冲突. 对于私有的扩展来说, 这个前缀不是必须的, 但是对于商业化或开源发布的公开扩展还是鼓励这样做的.

访问级别

对于INI指令, 开始总是有一个默认值. 多数情况下, 理想是保持默认值不变; 然而, 对于某些特殊的环境或者脚本内特定的动作, 这些值可能需要被修改. 如下表所示, INI指令的值可能在下面3个点被修改:

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读