首页 > 解决方案 > C 中的 PHP 扩展:_SERVER 在 RINIT 函数中为 NULL

问题描述

我正在尝试获取一些_SERVER变量,例如REMOTE_ADDRDOCUMENT_ROOTRINIT函数中(扩展请求初始化阶段):

...
    _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);
    } 
...

但变量_SERVERNULL. RINIT当我之后(例如在compile_file 中)执行相同的代码RINIT时,它具有正常值,我可以提取任何_SERVER元素。

看起来,它不是按RINIT阶段初始化的,但根据扩展工作周期,它应该已经被填充了。我见过的所有扩展,都是在RINIT函数中提取数据,所以它应该可以工作。

任何线索为什么会发生以及如何解决?

标签: phpcphp-extension

解决方案


似乎 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);

推荐阅读