php内核,取超全局变量$_SERVER,取域名例子
                        
                                                            php
                                                            _server
                                                            域名
                                                    
                         编程技术
                    
                    
                        
                             发布日期
                            2023-06-02 
                        
                        
                             更新日期
                            2023-06-04 
                        
                        
                             阅读次数 200
                        
                        
                             文章字数 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
                                            域名
                                    
                
                     
                     
                     
                     
                
            
            发表评论
相关推荐