最近,我将生产服务器升级到Ubuntu14.04和PHP5.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/"
我阅读文件以及这个有点相关的问题:数据。但是,我搞不懂为什么要把这个通知录下来。据我所知,我在代码库中的任何地方都没有使用$HTTP_RAW_POST_DATA
。我试过:
find . -exec grep "HTTP_RAW_POST_DATA" {} \; -print 2>/dev/null
从我的项目的根目录(包括所有供应商目录),但我没有找到任何匹配。
我是always_populate_raw_post_data
,似乎只有当always_populate_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
是做什么的?
发布于 2014-11-06 21:43:49
下面是相关C代码和我的评论:
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
仍然可以填充未知的内容类型。你必须用一个负值来跳过它。
这现在是手册中的记录在案:
访问原始POST数据的首选方法是php://input,PHP5.6.0以后不再推荐$HTTP_RAW_POST_DATA。将always_populate_raw_post_data设置为-1将选择在未来版本的$HTTP_RAW_POST_DATA中实现的新行为,而在该版本中,$HTTP_RAW_POST_DATA从未被定义过。
发布于 2014-11-06 21:40:32
它已经作为错误报告提交了
也可以阅读这。
基本上将值更改为-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但使用php://input,这样就可以通过将always_populate_raw_post_data设置为-1禁用$HTTP_RAW_POST_DATA的总体。它将删除E_DEPRECATED。
来自http://php.net/manual/en/ini.core.php
如果设置为TRUE,PHP将始终填充包含原始POST数据的$HTTP_RAW_POST_DATA。否则,只有当数据的MIME类型未被识别时,变量才会被填充。 访问原始POST数据的首选方法是php://input,PHP5.6.0以后不再推荐$HTTP_RAW_POST_DATA。将always_populate_raw_post_data设置为-1将选择在未来版本的$HTTP_RAW_POST_DATA中实现的新行为,而在该版本中,$HTTP_RAW_POST_DATA从未被定义过。
更改PHP-5.6
可重用的optioanlly JITty初始化的php://input流将always_populate_raw_post_data INI设置更改为接受三个值,而不是两个。 -1:主人的行为;永远不要植入$GLOBALSHTTP_RAW_POST_DATA 0/off/随便什么: BC行为(如果未注册内容类型或请求方法不是POST),则填充 1/on/yes/true: BC行为(总是填充$GLOBALSHTTP_RAW_POST_DATA)
https://stackoverflow.com/questions/26679157
复制相似问题