PHP究竟是如何创建超级全局$\u POST、$\u GET、$\u COOKIE和$\u请求的?

PHP究竟是如何创建超级全局$\u POST、$\u GET、$\u COOKIE和$\u请求的?,php,http,Php,Http,很抱歉把问题的标题弄混了,我会尽力澄清问题的所在 我正在使用Mongrel2服务器进行一些工作,并且正在编写一个能够访问原始HTTP请求数据的PHP处理程序。因为我在Mongrel2后面有PHP,所以没有自动创建$\u POST、$\u GET、$\u COOKIE和$\u请求变量 问题是-有没有一种方法可以将原始HTTP请求发送到PHP函数(或任何函数),该函数将生成在使用Apache+PHP时通常可用的超全局变量 注意:我可以手动解析HTTP请求并自己创建这些变量,但是我找不到任何关于PHP

很抱歉把问题的标题弄混了,我会尽力澄清问题的所在

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

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

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


谢谢你的意见。

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

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

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

$\u POST、$\u GET、$\u COOKIE和$\u REQUEST每次都可以在PHP中使用,如果PHP是在命令行中运行的话。这些数组是可写的,您可以将值添加到$\u 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();
编辑
此外,您还可以创建类,并将来自HttpRequest的数据保存在该类的静态字段中。在本例中,您可以从AnyWARE使用它。

创建这些变量是在PHP的精髓中,在
main/PHP\u variables.c
中,在
PHP\u auto\u globals\u create\u 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(例如,apachemodule/CGI/FastCGI/whatever)来获取变量。如果您身处一个奇怪的环境,GET/POST/etc变量不是PHP所期望的,我认为没有任何方法可以改变它的工作方式。

可以在PHP.net上找到,也许这会很有用:

$_POST = array();
$str = 'first=value&amp;arr[]=foo+bar&amp;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用于填充$\u GET、$\u POST等变量的机制相同



+1,最后是PHP中的一个好问题:)您是否尝试过$postdata=file\u get\u contents(“php://input"); ? 不确定它是否适用于您,但值得一试。@vascowhite-是的,我有,但问题是我通过ZeroMQ套接字接收头,因此没有向php://input. 我所拥有的只是一条来自Mongrel2(Netstring格式)的消息,我应该对它进行解析。我希望使用现有的PHP功能,因为它以某种方式解析Apache发送给它的HTTP请求。现在,ApachePHP进程和解析请求之间的通信对我来说是不明确的:)PHP可能在内部完成这项工作,而没有公开它用来完成这项工作的方法。我理解您为什么希望使用现有功能,但我不知道有任何功能适用于您的特定情况。看来你得自己动手了。我相信比我更了解PHP内部结构的人能够提供帮助,试着在PHP聊天室中发布一个指向这个问题的链接,那里有一些非常了解PHP的人。@vascowhite-谢谢,我会尝试的!这并不能回答问题。
HttpRequest
类用于发出HTTP请求,而不是解析它们。@dashwuff,True,但问题不仅在于解析它们,还在于
导入到超全局文件中
:)而
HttpRequest
与此完全无关-它与超全局文件没有任何关系。您可以随时修补Mongrel2,将它们放在PHP期望的位置,但这完全取决于PHP的运行方式。如果在PHP启动时请求数据不全部存在,我认为以后不可能让PHP解析它。@VinkoVrsalovic-我不能。Mongrel2(不是Mongrel的Ruby服务器,而是MongrelTwo的语言不可知服务器)的要点是它不知道使用哪种语言,它只是将消息发送到端点,就是这样。@Dashwuff-所以基本上,我必须创建一个扩展来包装C功能并用PHP编译它,这样我就可以从PHP中公开它了?真的没有别的办法吗?@Furicane:你最好的办法是为PHP编写一个新的Mongrel2 SAPI,或者为PHP拥有的另一个SAPI(如FastCGI)编写一个外部适配器。在PHP代码中尝试这样做是行不通的。处理$\u POST很容易,问题在于我使用多部分表单发送文件等,PHP准确解析所有请求。滚动我自己的解决方案需要测试,我重复一下-对于$\u POST/$\u GET来说,这样做很容易,问题在于$\u文件。解析头你也许可以抓取文件。标头应包含一个简单的MD5字段,该字段是文件内容。没有那么复杂。你有没有读过我的问题以及http_parse_头的实际功能?这不是我想要的。解析标题不适用于传入的数据,但如果您查看该页面,您将看到许多可以使用的用户函数。也可以按原样使用。另外,你的问题没有提到$u文件,所以我不知道你为什么现在说这是问题所在。您需要在故事的结尾推出自己的解决方案。阅读我发送的链接,祝你好运。
$_POST = array();
$str = 'first=value&amp;arr[]=foo+bar&amp;arr[]=baz';
parse_str(html_entity_decode($str), $_POST);
print_r($_POST);

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

)