警告不要使用$ HTTP_RAW_POST_DATA

我切换到PHP 5.6.0,现在我到处得到以下警告:

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 Warning: Cannot modify header information - headers already sent in Unknown on line 0 

好的,我依靠一些弃用的function。 除了我没有!

  1. 我从来没有在我的任何脚本中使用过这个variables。 说实话,我不知道它甚至存在。
  2. phpinfo()显示我always_populate_raw_post_data设置为0(禁用)。 那么发生了什么?

我不想通过将此值设置为-1来“避免警告”。 这只会隐藏警告,我仍然有不推荐使用的configuration。 我想从源头上解决问题,并知道为什么PHP认为HTTP_RAW_POST_DATA填充已打开。

事实certificate,我对错误信息的理解是错误的。 我会说它的特点非常糟糕的话的select。 谷歌search显示我有人像我一样错误地理解了这个消息 – 请参阅PHP错误#66763 。

在完全没有帮助的情况下“这是RM想要的方式”。 泰瑞尔解释说,将它设置为“-1”不会使警告消失。 它做正确的事情 ,即它完全禁用填充罪魁祸首variables。 事实certificate,它设置为0 仍然在某些情况下填充数据。 谈论糟糕的devise! 引用PHP RFC :

将always_populate_raw_post_data INI设置更改为接受三个值而不是两个值。

  • -1:主人的行为; 永远不要填充$ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / off / whatever:BC行为(如果内容types未注册或请求方法不是POST)
  • 1 / on / yes / true:BC行为(总是填充$ GLOBALS [HTTP_RAW_POST_DATA])

所以是的,将它设置为-1不仅可以避免警告,就像信息所说,但最终还是禁用了这个variables,这正是我想要的。

我在nginx服务器(DigitalOcean)上遇到了同样的问题 – 我只需要以root身份login并修改文件/etc/php5/fpm/php.ini

要findalways_populate_raw_post_data行,我首先运行grep

 grep -n 'always_populate_raw_post_data' php.ini 

这返回704

 704:;always_populate_raw_post_data = -1 

然后只需用vi编辑器打开php.ini就行了:

 vi +704 php.ini 

删除分号取消注释并保存文件:wq

最后重启服务器,错误消失了。

过了一段时间,直到我遇到这个错误。 对任何可能遇到这个问题的人提出我的回答。

错误只意味着你正在发送一个空的POST请求。 HTTPRequests上通常会发现此错误,而不传递任何参数。 为了避免这个错误,你总是可以在不改变php.ini的情况下向POST添加一个参数。

喜欢:

 $.post(URL_HERE ,{addedvar : 'anycontent'} ,function(d){ doAnyHere(d); } ,'json' //or 'html','text' ); 

如果你正在使用WAMP

您应该在php.ini添加或取消注释always_populate_raw_post_data属性,并将其值设置为-1 。 在我的情况下, php.ini位于:

C:\wamp64\bin\php\php5.6.25\php.ini

但如果你仍然收到警告(就像我一样)

您还应该在phpForApache.ini设置always_populate_raw_post_data = -1

C:\wamp64\bin\php\php5.6.25\phpForApache.ini

如果找不到该文件,请打开浏览器窗口并转至:

http://localhost/?phpinfo=1

并查找加载的configuration文件密钥的值。 在我的情况下,WAMP使用的php.ini位于:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (符号链接C:\ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

最后重启WAMP(或者点击重启所有服务)

取消注释

 always_populate_raw_post_data = -1 

在php.ini(行#703),并重新启动APACHE服务,无论如何帮助我摆脱消息

 ; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is ; to disable this feature and it will be removed in a future version. ; If post reading is disabled through enable_post_data_reading, ; $HTTP_RAW_POST_DATA is *NOT* populated. ; http://php.net/always-populate-raw-post-data ; always_populate_raw_post_data = -1 

对于任何人仍然在改变php.init作为接受的答案build议后,与这个问题苦苦挣扎。 由于当没有任何参数通过POST ajax请求时发生的错误,所有你需要做的就是将发送方法改为GET

 var xhr = $.ajax({ url: url, type: "GET", dataType: "html", timeout: 500, }); 

如果您想保留POST方法,还有其他select是为了将一个空的JSON对象添加到ajax petititon。

 var xhr = $.ajax({ url: url, type: "POST", data: {name:'emtpy_petition_data', value: 'empty'} dataType: "html", timeout: 500, }); 

如果.htaccess文件不能avilable创build它在根文件夹并通过这行代码。

把这个放在.htaccess文件中(对APItesting效果很好)

 <IfModule mod_php5.c> php_value always_populate_raw_post_data -1 </IfModule>