PHP расширение в C: _SERVER равен NULL в функции RINIT - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь получить некоторые переменные _SERVER, например, REMOTE_ADDR или DOCUMENT_ ROOT в функции RINIT (фаза инициализации запроса расширения):

...
    _SERVER = Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]);

    if (_SERVER == NULL) {
        _log("_SERVER is null");
        return;
    }

    if (_G(doc_root) == NULL && (NULL != (tmp = zend_hash_str_find(_SERVER, "DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT") - 1)))) {
        _G(doc_root) = Z_STRVAL_P(tmp);
    } 
...

Но переменная _SERVER имеет значение NULL в RINIT. Когда я выполняю тот же код после RINIT (например, в compile_file), он имеет нормальное значение, и я могу извлечь любые элементы _SERVER.

Кажется, что он инициализируется не фазой RINIT, а в соответствии с рабочим циклом расширения. оно должно быть уже заполнено. И все расширения, которые я видел, извлекают данные в функцию RINIT, чтобы она работала.

Любая подсказка, почему это может произойти и как это исправить?

1 Ответ

0 голосов
/ 22 марта 2020

Кажется, что zend_is_auto_global (...) решил проблему:

zend_string *server = zend_string_init("_SERVER", sizeof("_SERVER") - 1, 0);
zend_is_auto_global(server);    
_SERVER = Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]);
zend_string_release(server);
...