22

很抱歉问题的标题令人困惑,我将尝试澄清问题所在。

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

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

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

感谢您的任何意见。

4

4 回答 4

7

创建这些变量是在 PHP 的内部、in main/php_variables.c、 inphp_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 所期望的,我认为没有任何方法可以改变它的工作方式。

于 2013-05-07T15:33:32.297 回答
1

Found on php.net maybe this will be useful:

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

)

Note:

The magic_quotes_gpc setting affects the output of this function, as parse_str() uses the same mechanism that PHP uses to populate the $_GET, $_POST, etc. variables.

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

于 2013-05-07T15:35:48.877 回答
1

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

发送带有此类标头的 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

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

HttpRequest::setPostFields(array(
    "parameter" => "value"
));
于 2013-05-07T15:23:36.587 回答
-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 的数据保存在它的静态字段中。在这种情况下,您可以随时使用它。

于 2013-05-07T15:28:29.860 回答