PHP究竟是如何创建超全球的$ _POST,$ _GET,$ _COOKIE和$ _REQUEST的?

2022-08-30 19:20:17

我很抱歉混淆了问题的标题,我会尝试澄清问题是什么。

我正在使用Mongrel2服务器进行一些工作,并且我正在编写一个可以访问原始HTTP请求数据的PHP处理程序。因为我在Mongrel2后面有PHP,所以没有自动创建$_POST,$_GET,$_COOKIE和$_REQUEST变量。

问题是 - 有没有办法将原始HTTP请求发送到PHP函数(或任何东西),该函数将产生在使用Apache + PHP时通常可用的超全局变量?

注意:我可以手动解析HTTP请求并自己创建这些变量,但是我无法找到任何关于PHP如何进行HTTP解析和导入到超全局的文档。如果可能的话,我想自动化这个超全球创建过程,而不必自己解析HTTP请求。

感谢您的任何意见。


答案 1

创建这些变量是在 PHP 的内脏中深入处理的,在 和 类似函数中。从 PHP 5.4.3 开始:main/php_variables.cphp_auto_globals_create_get()

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 */
}

这最终直接调用SAPI(例如,Apache模块/ CGI / FastCGI / whatever)来获取变量。我不认为有任何方法可以改变它的工作方式,如果你处于一个奇怪的环境中,GET/POST/etc变量不是PHP期望它们的位置。


答案 2

我正试图用我所知道的知识为这个问题做出贡献。

发送带有此类标头的 HTTP 请求可能会复制 POST 变量

POST /somepage.php HTTP/1.1
Host: www.domain.com
User-Agent: Mozilla/12.0
Content-Length: 31
Content-Type: application/x-www-form-urlencoded

parameter=value&testcode=value1

另外,您可能还想检查PHP的libray。[从这里开始]。对于POST数据,您可以使用并为其设置自己的数据来覆盖以前的POST内容。HttpRequestHttpRequest::setPostFields()

HttpRequest::setPostFields(array(
    "parameter" => "value"
));

推荐