我最近将我的生产服务器升级到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_DATA
且always_populate_raw_post_data
设置为0
,为什么我会在错误日志中收到这些通知?将always_populate_raw_post_data
设置为-1
会有什么作用?
答案 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])