// 如果configuration_hash中没有找到,则采用默认值
if (!config_directive_success && hashed_ini_entry->on_modify) {
hashed_ini_entry->on_modify(hashed_ini_entry, hashed_ini_entry->value, hashed_ini_entry->value_length, hashed_ini_entry->mh_arg1, hashed_ini_entry->mh_arg2, hashed_ini_entry->mh_arg3, ZEND_INI_STAGE_STARTUP TSRMLS_CC);
}
p++;
}
return SUCCESS;
}
简单来说,可以把上述代码的逻辑表述为:
1,将模块声明的ini配置项添加到EG(ini_directives)中。注意,ini配置项的值可能在随后被修改。
2,尝试去configuration_hash中寻找各个模块需要的ini。
如果能够找到,说明用户叜ini文件中配置了该值,那么采用用户的配置。
如果没有找到,OK,没有关系,因为模块在声明ini的时候,会带上默认值。
3,将ini的值同步到XX_G里面。毕竟在php的执行过程中,起作用的还是这些XXX_globals。具体的过程是调用每条ini配置对应的on_modify方法完成,on_modify由模块在声明ini的时候进行指定。
我们来具体看下on_modify,它其实是一个函数指针,来看两个具体的Core模块的配置声明:
复制代码 代码如下:
STD_PHP_INI_BOOLEAN("log_errors", "0", PHP_INI_ALL, OnUpdateBool, log_errors, php_core_globals, core_globals)
STD_PHP_INI_ENTRY("log_errors_max_len","1024", PHP_INI_ALL, OnUpdateLong, log_errors_max_len, php_core_globals, core_globals)
对于log_errors,它的on_modify被设置为OnUpdateBool,对于log_errors_max_len,则on_modify被设置为OnUpdateLong。
进一步假设我们在php.ini中的配置为:
复制代码 代码如下:
log_errors = On
log_errors_max_len = 1024
具体来看下OnUpdateBool函数:
复制代码 代码如下:
ZEND_API ZEND_INI_MH(OnUpdateBool)
{
zend_bool *p;
// base表示core_globals的地址
char *base = (char *) mh_arg2;