使用 zend API 更改 php.ini 个条目
Changing php.ini entries using zend API
我正在尝试使用 zend 更改 php.ini 中的一些选项。
我有自己的空扩展,它可以工作,使用全局变量并很好地初始化,所以一切看起来都很好...
但是我找不到答案:
是否可以从扩展本身中更改 php.ini 全局变量?
我想知道我是否可以更改系统核心 'disable_functions'?
这是我在扩展中更改 php.ini 的代码 (c++)。它将忽略事件 on_modify
。或许能帮到你。
bool hack_ini_set (std::string _name, std::string _val)
{
zend_ini_entry *ini_entry;
char *duplicate;
zend_bool modifiable;
zend_bool modified;
char* name = const_cast<char*> (_name.c_str());
uint name_length = strlen(name)+1;
char* new_value= const_cast<char*> (_val.c_str());
uint new_value_length = strlen(new_value);
if (zend_hash_find(EG(ini_directives), name, name_length, (void **) &ini_entry) == FAILURE) {
return false;
}
modifiable = ini_entry->modifiable;
modified = ini_entry->modified;
if (!EG(modified_ini_directives)) {
ALLOC_HASHTABLE(EG(modified_ini_directives));
zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0);
}
if (!modified) {
ini_entry->orig_value = ini_entry->value;
ini_entry->orig_value_length = ini_entry->value_length;
ini_entry->orig_modifiable = modifiable;
ini_entry->modified = 1;
zend_hash_add(EG(modified_ini_directives), name, name_length, &ini_entry, sizeof(zend_ini_entry*), NULL);
}
duplicate = estrndup(new_value, new_value_length);
if (modified && ini_entry->orig_value != ini_entry->value) {
efree(ini_entry->value);
}
ini_entry->value = duplicate;
ini_entry->value_length = new_value_length;
return true;
}
您可以在文件中查看更多内容 zend_ini.c
ZEND_API int zend_alter_ini_entry_ex(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage, int force_change TSRMLS_DC)
我正在尝试使用 zend 更改 php.ini 中的一些选项。 我有自己的空扩展,它可以工作,使用全局变量并很好地初始化,所以一切看起来都很好...
但是我找不到答案:
是否可以从扩展本身中更改 php.ini 全局变量? 我想知道我是否可以更改系统核心 'disable_functions'?
这是我在扩展中更改 php.ini 的代码 (c++)。它将忽略事件 on_modify
。或许能帮到你。
bool hack_ini_set (std::string _name, std::string _val)
{
zend_ini_entry *ini_entry;
char *duplicate;
zend_bool modifiable;
zend_bool modified;
char* name = const_cast<char*> (_name.c_str());
uint name_length = strlen(name)+1;
char* new_value= const_cast<char*> (_val.c_str());
uint new_value_length = strlen(new_value);
if (zend_hash_find(EG(ini_directives), name, name_length, (void **) &ini_entry) == FAILURE) {
return false;
}
modifiable = ini_entry->modifiable;
modified = ini_entry->modified;
if (!EG(modified_ini_directives)) {
ALLOC_HASHTABLE(EG(modified_ini_directives));
zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0);
}
if (!modified) {
ini_entry->orig_value = ini_entry->value;
ini_entry->orig_value_length = ini_entry->value_length;
ini_entry->orig_modifiable = modifiable;
ini_entry->modified = 1;
zend_hash_add(EG(modified_ini_directives), name, name_length, &ini_entry, sizeof(zend_ini_entry*), NULL);
}
duplicate = estrndup(new_value, new_value_length);
if (modified && ini_entry->orig_value != ini_entry->value) {
efree(ini_entry->value);
}
ini_entry->value = duplicate;
ini_entry->value_length = new_value_length;
return true;
}
您可以在文件中查看更多内容 zend_ini.c
ZEND_API int zend_alter_ini_entry_ex(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage, int force_change TSRMLS_DC)