php内核,取超全局变量$_SERVER,取域名例子
php
_server
域名
编程技术
发布日期
2023-06-02
更新日期
2023-06-04
阅读次数 83
文章字数 1.2k
超全局变量,存储在EG中,一般有_GET、_POST,_COOKIE等
只读环境变量的读取方式:
&PG(http_globals)[TRACK_VARS_GET];
&PG(http_globals)[TRACK_VARS_POST];
&PG(http_globals)[TRACK_VARS_REQUEST];
&PG(http_globals)[TRACK_VARS_COOKIE];
&PG(http_globals)[TRACK_VARS_ENV];
&PG(http_globals)[TRACK_VARS_FILES];
但是PHP设计其实就是利用”懒惰”的思路进行优化,标记了JIT=1的超级全局变量,默认PHP是不会执行auto_global_callback进行初始化的。除非用户主动的声明要访问它,也就是调用zend_is_auto_global_str(zend_is_auto_global),以取$_SERVER为例代码:
//先尝试加载$_SERVER,默认情况下可能为空
zend_is_auto_global_str("_SERVER", sizeof("_SERVER") - 1);
//取$_SERVER
zval *server = zend_hash_str_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER") - 1);
//已知$_SERVER是一个数组,直接返回$_SERVER数组
// RETURN_ARR(Z_ARR_P(server));
//取域名
zval * host = zend_hash_str_find(Z_ARRVAL_P(server), ZEND_STRL("HTTP_HOST"));
if(Z_TYPE_P(host) == IS_STRING){
char * host1 = zend_string_copy(Z_STR_P(host));
RETURN_STR(host1); //返回HTTP_HOST字符串
}else{
RETURN_NULL();
}
取域名例子2
//先尝试加载$_SERVER,默认情况下可能为空
zend_is_auto_global_str("_SERVER", sizeof("_SERVER") - 1);
//取$_SERVER
// zval **c;
zval *server = zend_hash_str_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER") - 1);
zend_string *str;
str = zend_string_init(ZEND_STRL("HTTP_HOST"), 0);
// RETURN_STR(str);
zval * findRes = zend_hash_find(Z_ARRVAL_P(server),str); //zend * zend_hash_find(hashTable, zend_string)
zend_string *hostName = zend_string_copy(Z_STR_P(findRes)); //此时可以用char *或者zend_string *接收,后者更严谨
RETURN_STR(hostName);
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-413.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。
php
_server
域名
发表评论
相关推荐