How exactly is PHP creating superglobal $_POST, $_GET, $_COOKIE and $_REQUEST?

后端 未结 4 1847
遥遥无期
遥遥无期 2021-02-02 11:38

I\'m sorry for confusing title of the question, I\'ll try to clarify what the issue is.

I\'m doing some work with Mongrel2 server and I\'m writing a PHP handler that has

4条回答
  •  北海茫月
    2021-02-02 12:03

    Creating these variables is handled deep within the guts of PHP, in main/php_variables.c, in the php_auto_globals_create_get() and similar functions. From PHP 5.4.3:

    static zend_bool php_auto_globals_create_get(const char *name, uint name_len TSRMLS_DC)
    {
            zval *vars;
    
            if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) {
                    sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC);
                    vars = PG(http_globals)[TRACK_VARS_GET];
            } else {
                    ALLOC_ZVAL(vars);
                    array_init(vars);
                    INIT_PZVAL(vars);
                    if (PG(http_globals)[TRACK_VARS_GET]) {
                            zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_GET]);
                    }
                    PG(http_globals)[TRACK_VARS_GET] = vars;
            }
    
            zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
            Z_ADDREF_P(vars);
    
            return 0; /* don't rearm */
    }
    

    This ends up calling directly into the SAPI (e.g, Apache module / CGI / FastCGI / whatever) to fetch variables. I don't think there's any way you can alter the way this works if you're in a weird environment where GET/POST/etc variables aren't where PHP expects them to be.

提交回复
热议问题