为什么要调用$ HTTP_RAW_POST_DATA?

时间:2014-10-31 16:21:45

标签: php

我最近将我的生产服务器升级到Ubuntu 14.04和PHP 5.6,现在我在错误日志中收到警告:

2014/10/31 10:42:45 [error] 17128#0: *46238 FastCGI sent in stderr: "PHP message: PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0" while reading response header from upstream, client: 24.123.216.42, server: example.com, request: "POST /api/notes HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "example.com", referrer: "https://example.com/admin/"

read the documentation以及这个有点相关的问题:Undefined variable: HTTP_RAW_POST_DATA。但是,我无法弄清楚为什么要记录此通知。据我所知,我在代码库中的任何地方都没有使用$HTTP_RAW_POST_DATA。我试过了:

find . -exec grep "HTTP_RAW_POST_DATA" {} \; -print 2>/dev/null

来自我项目的根目录(包括所有供应商目录),但我没有找到任何匹配。

read more about always_populate_raw_post_data并且只有在$HTTP_RAW_POST_DATA参数设置为TRUE时才会填充always_populate_raw_post_data。我检查了phpinfo(),参数设置为0。

如果我没有明确调用$HTTP_RAW_POST_DATAalways_populate_raw_post_data设置为0,为什么我会在错误日志中收到这些通知?将always_populate_raw_post_data设置为-1会有什么作用?

2 个答案:

答案 0 :(得分:9)

这是我的评论the relevant C code

static zend_bool populate_raw_post_data(TSRMLS_D)
{
    // not a post, empty request - return FALSE
    if (!SG(request_info).request_body) {
        return (zend_bool) 0;
    }

    // if always_populate_raw_post_data=0 then
    // if we don't know how to parse the post (unknown mimetype) return TRUE
    // otherwise (known mimetype) return FALSE
    if (!PG(always_populate_raw_post_data)) {
        return (zend_bool) !SG(request_info).post_entry;
    }

    // if always_populate_raw_post_data > 0 return TRUE
    // if always_populate_raw_post_data < 0 return FALSE
    return (zend_bool) (PG(always_populate_raw_post_data) > 0);
}

也就是说,将always_populate_raw_post_data设置为0仍然可以填充未知内容类型。您必须使用负值才能完全跳过它。

现在手册中的documented

  

访问原始POST数据的首选方法是php:// input,并且PHP 5.6.0以后不推荐使用$ HTTP_RAW_POST_DATA。将always_populate_raw_post_data设置为-1将选择将在未来版本的PHP中实现的新行为,其中永远不会定义$ HTTP_RAW_POST_DATA。

答案 1 :(得分:4)

它已经被归档为bug report

另请阅读this

基本上将值更改为-1,然后解决问题&#34;。

另外,请务必使用php://input在V

以下阅读更多内容
  

我认为描述实际发生的事情会更好:   填充$ HTTP_RAW_POST_DATA时将生成E_DEPRECATED   由always_populate_raw_post_data的值控制(链接   到我们已经描述过的http://php.net/manual/en/ini.core.php   在哪种情况下将填充$ HTTP_RAW_POST_DATA)并删除   已弃用的消息请确保您不使用$ HTTP_RAW_POST_DATA   但是php://输入然后你可以禁用人口   $ HTTP_RAW_POST_DATA通过将always_populate_raw_post_data设置为-1,   这将删除E_DEPRECATED。

来自http://php.net/manual/en/ini.core.php

  

如果设置为TRUE,PHP将始终填充$ HTTP_RAW_POST_DATA   包含原始POST数据。否则,填充变量   仅当数据的MIME类型无法识别时。

     

访问原始POST数据的首选方法是php:// input,和   从PHP 5.6.0开始,不推荐使用$ HTTP_RAW_POST_DATA。设置   always_populate_raw_post_data为-1将选择进入新行为   这将在未来的PHP版本中实现,其中   永远不会定义$ HTTP_RAW_POST_DATA。


PHP-5.6

的更改
  

可重用,optioanlly JITty初始化php://输入流更改   always_populate_raw_post_data INI设置接受三个值   而不是两个。

     

-1:主人的行为;不要填充$ GLOBALS [HTTP_RAW_POST_DATA]

     

0 / off / whatever:BC行为(如果内容类型不是,则填充   注册或请求方法不是POST)

     

1 / on / yes / true:BC行为(总是填充   $ GLOBALS [HTTP_RAW_POST_DATA])