首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP究竟是如何创建超级全局$_POST、$_GET、$_COOKIE和$_REQUEST的?

PHP究竟是如何创建超级全局$_POST、$_GET、$_COOKIE和$_REQUEST的?
EN

Stack Overflow用户
提问于 2013-05-07 15:13:55
回答 3查看 1.9K关注 0票数 22

我很抱歉混淆了这个问题的标题,我将试图澄清问题是什么。

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

问题是,是否有一种方法可以将原始HTTP请求发送到PHP函数(或任何东西),从而生成在使用Apache + PHP时通常可用的超全局变量?

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

谢谢您的意见。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-07 15:33:32

在PHP的内部,在main/php_variables.c中,在php_auto_globals_create_get()和类似的函数中,创建这些变量是非常重要的。来自PHP 5.4.3:

代码语言:javascript
复制
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 /任何东西)来获取变量。我认为,如果您所处的环境很奇怪,GET/POST/etc变量并不是PHP所期望的那样,您就无法改变它的工作方式。

票数 7
EN

Stack Overflow用户

发布于 2013-05-07 15:23:36

我正试图用我所知道的知识来回答这个问题。

发送带有此类标头的HTTP请求可以重复POST变量

代码语言:javascript
复制
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。[从这里开始]。对于POST数据,可以使用HttpRequest::setPostFields()覆盖以前的POST内容,并为其设置自己的数据。

代码语言:javascript
复制
HttpRequest::setPostFields(array(
    "parameter" => "value"
));
票数 1
EN

Stack Overflow用户

发布于 2013-05-07 15:35:48

在php.net上找到的,也许这将是有用的:

代码语言:javascript
复制
$_POST = array();
$str = 'first=value&arr[]=foo+bar&arr[]=baz';
parse_str(html_entity_decode($str), $_POST);
print_r($_POST);

Array
(
    [first] => value
    [arr] => Array
        (
            [0] => foo bar
            [1] => baz
        )

)

注意: magic_quotes_gpc设置会影响该函数的输出,因为parse_str()使用与PHP相同的机制填充$_GET、$_POST等变量。

http://php.net/manual/en/function.parse-str.php

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16422605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档