php - C 中的 PHP 扩展:_SERVER 在 RINIT 函数中为 NULL
问题描述
我正在尝试获取一些_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
当我之后(例如在compile_file 中)执行相同的代码RINIT
时,它具有正常值,我可以提取任何_SERVER
元素。
看起来,它不是按RINIT
阶段初始化的,但根据扩展工作周期,它应该已经被填充了。我见过的所有扩展,都是在RINIT
函数中提取数据,所以它应该可以工作。
任何线索为什么会发生以及如何解决?
解决方案
似乎 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);
推荐阅读
- c# - Visual Studio:打开文档并在修改时显示它
- python - 如何通过从另一个数据框中随机选择来创建数据框?
- python - 如何将 python 路径与递归 glob 模式匹配
- typescript - express res.redirect() 在登录时不起作用
- node.js - npx create-react-app myapp 生成 FETCH_ERROR
- google-cloud-sql - 无法增加 Cloud SQL 存储
- laravel - 如何使用所见即所得的 php 中的数据库中的数据设置阅读更多按钮
- php - PHP fopen不断输入URL失败
- java - VS Code 无法解析我在同一目录中创建的 Java 类型
- angular - Angular 10 在 ngFOR 中上传图片