2015-01-19 2 views
1

Я пытаюсь изменить некоторые параметры php.ini с помощью zend. У меня есть свое пустое расширение, он работает, использует глобальные переменные и инициализирует хорошо, так что все, кажется, хорошо ...Изменение записей php.ini с использованием zend API

Но я не могу найти ответ:

Можно ли изменить php.ini глобалы изнутри самого расширения? Интересно, могу ли я изменить системное ядро ​​'disable_functions'?

ответ

0

это мой код (C++) для изменения php.ini в расширении. он будет игнорировать событие 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)