关于不推荐使用`$ HTTP_RAW_POST_DATA`的警告

时间:2014-10-08 15:41:39

标签: php configuration migration

我切换到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

好吧,我依靠一些不赞成使用的功能。除了我没有!

  1. 我从未在任何脚本中使用过此变量。说实话,我甚至不知道它存在。
  2. phpinfo()表示我将always_populate_raw_post_data设置为0(已禁用)。那是怎么回事?
  3. 我不想通过将此值设置为-1来“避免警告”。这只会隐藏警告,我仍然会弃用配置。我想从源头解决问题,并知道为什么PHP认为HTTP_RAW_POST_DATA填充已打开。

13 个答案:

答案 0 :(得分:126)

事实证明,我对错误信息的理解是错误的。我会说它的选择非常糟糕。谷歌搜索我,其他人误解了这个消息,就像我一样 - 见PHP bug #66763

完全无益之后“这就是客户经理想要的方式。” Tyrael对这个错误的回应解释说,将它设置为“-1”并不会使警告消失。它执行正确的事情,即它完全禁用填充罪魁祸首变量。事实证明,在某些情况下将其设置为0 STILL 会填充数据。谈论糟糕的设计!引用PHP RFC

  

将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])
  •   

所以是的,将它设置为-1不仅可以避免警告,就像消息所说的那样,但它也最终禁用填充此变量,这就是我想要的。

答案 1 :(得分:33)

在我遇到此错误之前已经有一段时间了。对可能偶然发现这个问题的人提出我的答案。

错误仅表示您发送空POST请求。在没有传递参数的HTTPRequests上常见此错误。要避免此错误,您始终可以在不更改php.ini的情况下向POST添加参数。

像:

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

答案 2 :(得分:31)

我在nginx服务器(DigitalOcean)上遇到了同样的问题 - 我所要做的就是以root身份登录并修改文件/etc/php5/fpm/php.ini

要找到always_populate_raw_post_data我首先运行grep的行:

grep -n 'always_populate_raw_post_data' php.ini

返回了行704

704:;always_populate_raw_post_data = -1

然后只需使用php.ini编辑器

在该行上打开vi
vi +704 php.ini

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

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

答案 3 :(得分:11)

  

如果您使用的是 WAMP ...

您应在always_populate_raw_post_data中添加或取消注释属性php.ini,并将其值设置为-1。就我而言,php.ini位于:

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

  

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

     

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

     

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

     

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

     

http://localhost/?phpinfo=1

     

并查找已加载配置文件键的值。就我而言,WAMP使用的php.ini位于:

     

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

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

答案 4 :(得分:5)

取消注释

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

答案 5 :(得分:5)

如果.htaccess文件不可用,请在根文件夹上创建并超过此行代码。

将此文件放入.htaccess文件(测试适用于API)

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

答案 6 :(得分:4)

对于仍然在更改php.init之后仍然遇到此问题的人,如接受的答案所示。由于错误发生在通过POST进行ajax请求而没有任何参数时,您只需将发送方法更改为GET

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

如果你想以任何理由保留方法POST,还有另一个选择是将空的JSON对象添加到ajax petititon。

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

答案 7 :(得分:3)

从html表单发送数据时我收到此错误消息(Post方法)。我所要做的就是改变表格中的编码来自&#34; text / plain&#34; to&#34; application / x-www-form-urlencoded&#34;或&#34; multipart / form-data&#34;。 错误消息非常误导。

答案 8 :(得分:0)

不幸的是,@ EatOng在此处给出的答案不正确。阅读他的回答后,我向我触发的每个AJAX请求中都添加了一个虚拟变量(即使其中一些已经具有一些字段),以确保错误不会出现。

但是现在我遇到了来自PHP的同样该死的错误。我再次确认我已经发送了一些POST数据(一些其他字段以及哑变量)。 PHP版本5.6.25的{​​{1}}值设置为always_populate_raw_post_data

此外,在发送0请求时,PHP并未将其填充到application/json中,而是必须$_POST来访问{{1}可以访问的原始POST请求正文。 }。

作为@rrite的答案,

  

0 /关闭/任何:BC行为(如果未注册 content-type 请求方法不是POST )。

因为request方法是确定的POST,所以我猜PHP无法识别/喜欢我的json_decode()请求(再次,为什么?)。

选项1:

手动编辑php://input文件,并将罪魁祸首变量设置为Content-Type: application/json,如此处的许多答案所示。

选项2:

这是一个PHP 5.6错误。升级PHP。

选项3:

@ user9541305在此处回答时,将AJAX请求的php.ini更改为-1Content-Type将使PHP从发布的正文中填充application/x-www-form-urlencoded(因为PHP喜欢/识别那些multipart/form-data标题!?)。

选项4:最后的答案

好吧,我不想更改AJAX的$_POST,这会给调试带来很多麻烦。 (Chrome DevTools很好地查看了JSON请求的POSTed变量。)

我正在为客户端开发此东西,不能要求他们使用最新的PHP,也不能编辑php.ini文件。作为最后的选择,我只检查它是否设置为content-type,如果是,请在我的PHP脚本本身中编辑Content-Type文件。当然,我将不得不要求用户重新启动apache。真可惜!

这是示例代码:

0

答案 9 :(得分:0)

好吧,如果有人在共享主机上,并且无法访问php.ini文件,则可以在PHP文件的顶部设置以下代码行:

ini_set('always_populate_raw_post_data', -1);

更多相同的作品。我希望它可以节省一些调试时间:)

答案 10 :(得分:0)

注意:如果您正在使用PHPSTORM enter image description here


我花了一个小时试图解决这个问题,以为那是我的php服务器问题,所以我在中将'always_populate_raw_post_data'设置为'-1' > php.ini ,没有任何效果。

直到我发现使用内置服务器的phpStorm才是导致问题的原因,如此处的答案所述:Answer by LazyOne Here,所以我考虑过共享它。

答案 11 :(得分:-1)

always_populate_raw_post_data = -1 在php.init中 删除此行的评论.. always_populate_raw_post_data = -1

答案 12 :(得分:-1)

我刚刚从朋友那里得到了解决这个问题的方法。 他说:添加ob_start();在您的会话代码下。 您可以添加exit();在标题下。 我尝试了,它奏效了。 希望对您有帮助

这是针对那些租用托管服务器但无法访问php.init文件的人。