【问题标题】:Why is $HTTP_RAW_POST_DATA being called?为什么要调用 $HTTP_RAW_POST_DATA?
【发布时间】:2014-12-28 00:55:09
【问题描述】:

我最近将生产服务器升级到 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 并且似乎只有在 always_populate_raw_post_data 参数设置为 TRUE 时才应填充 $HTTP_RAW_POST_DATA。我检查了我的phpinfo(),参数设置为0。

如果我没有明确调用$HTTP_RAW_POST_DATA 并且always_populate_raw_post_data 设置为0,为什么我的错误日志中会出现这些通知?将always_populate_raw_post_data 设置为-1 有什么作用?

【问题讨论】:

  • 有可能是隐藏在服务器的配置文件中。
  • 我想过。我跑了find /etc/nginx -exec grep "always_populate_raw_post_data" {} \; -print 2>/dev/null 没有结果。此外,它在phpinfo() 中显示为0
  • 你知道这个问题,创建重现问题的最少代码。
  • 顺便说一句。您不接受我的帖子作为答案是否有具体原因?我想知道未来的改进。

标签: php


【解决方案1】:

这是 the relevant C code 和我的 cmets:

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。

【讨论】:

  • 我发誓昨天的文档中没有关于将 auto_populate_raw_post_data 设置为 -1 的说明!
  • 是的,似乎已添加注释以响应提到的错误报告 deW1。
  • 是的,我猜文档更新需要一段时间,而且您没有足够幸运在 1 天后检查此内容 :)
【解决方案2】:

它已经被归档为bug report

另请阅读this

基本上将值更改为-1,这将解决您的“问题”。

同时确保你使用php://input阅读更多下面的V

我认为描述实际发生的事情会更好: E_DEPRECATED 将在填充 $HTTP_RAW_POST_DATA 时生成 由 always_populate_raw_post_data 的值控制(链接 到http://php.net/manual/en/ini.core.php 我们已经描述过的地方 在这种情况下将填充 $HTTP_RAW_POST_DATA)并删除 不推荐使用的消息确保您不使用 $HTTP_RAW_POST_DATA 但是 php://input 然后你可以禁用人口 $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,并且 $HTTP_RAW_POST_DATA 从 PHP 5.6.0 开始被弃用。环境 always_populate_raw_post_data 到 -1 将选择新行为 这将在 PHP 的未来版本中实现,其中 $HTTP_RAW_POST_DATA 从未定义。


更改为PHP-5.6

可重用,可选 JITty 初始化 php://input stream 更改 always_populate_raw_post_data INI 设置接受三个值 而不是两个。

-1:master的行为;永远不要填充 $GLOBALS[HTTP_RAW_POST_DATA]

0/off/whatever:BC 行为(如果 content-type 不是则填充 注册或请求方法不是 POST)

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

【讨论】:

  • 将值更改为 -1 确实可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多