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

时间:2013-05-07 15:13:55

标签: php http

我很抱歉混淆了问题的标题,我会试着澄清问题所在。

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

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

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

感谢您的任何意见。

4 个答案:

答案 0 :(得分:7)

创建这些变量在PHP的内部,main/php_variables.cphp_auto_globals_create_get()和类似函数中深入处理。从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 */
}

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

答案 1 :(得分:0)

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

发送带有此类标头的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的HttpRequest库。 [Start here]。对于POST数据,您可以使用HttpRequest::setPostFields()覆盖以前的POST内容,并为其设置自己的数据。

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

答案 2 :(得分:0)

在php.net上找到这可能会有用:

$_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

答案 3 :(得分:-5)

$ _ POST,$ _GET,$ _COOKIE和$ _REQUEST每次都可以在PHP中使用,如果php是在命令行中运行的话。这些数组是可写的,您可以向$ _POST数组添加值,并在任何其他位置获取一个。

如果从控制台运行它,则此代码完全正确且可行:

<?php

$_POST['test'] = '1';
echo "\$_POST in global scope:\n";
var_dump($_POST);

function p() {
     echo "\$_POST in function scope:\n";

     var_dump($_POST);

     echo "Others super-global array in function scope:\n";
     var_dump($_REQUEST);
     var_dump($_COOKIE);

}

p();

结果:

$_POST in global scope:
array(1) {
  'test' =>
  string(1) "1"
}
$_POST in function scope:
array(1) {
  'test' =>
  string(1) "1"
}
Others super-global array in function scope:
array(0) {
}
array(0) {
}

修改

此外,您可以创建类,并在HttpRequest的静态字段中保存数据。在这种情况下,您可以从任何地方使用它。