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

问题描述 投票:112回答:9

我切换到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(禁用)。那么发生了什么?

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

php configuration migration
9个回答
127
投票

事实证明,我对错误信息的理解是错误的。我会说它的选择非常糟糕。谷歌搜索显示我其他人完全像我一样误解了这个消息 - 请参阅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不仅可以避免警告,就像消息所说的那样,但它最终也会禁用填充此变量,这就是我想要的。


34
投票

有一段时间,直到我遇到这个错误。为可能偶然发现这个问题的人提出我的答案。

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

喜欢:

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

32
投票

我在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

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


12
投票

如果你正在使用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

并查找Loaded Configuration File键的值。就我而言,WAMP使用的php.ini位于:

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

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


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
投票

如果qazxsw poi文件不可用,请在根文件夹上创建它并通过这行代码。

把它放在.htaccess文件中(经测试适用于API)

.htaccess

4
投票

对于仍然在更改php.init之后仍然遇到此问题的人,如接受的答案所示。由于错误发生在通过<IfModule mod_php5.c> php_value always_populate_raw_post_data -1 </IfModule> 进行ajax请求而没有任何参数时,您需要做的就是将send方法更改为POST

GET

如果你想保持方法var xhr = $.ajax({ url: url, type: "GET", dataType: "html", timeout: 500, }); 由于任何原因仍然是另一个选择是添加一个空的JSON对象到ajax petititon。

POST

3
投票

从html表单发送数据时我收到此错误消息(Post方法)。我所要做的就是将表单中的编码从“text / plain”更改为“application / x-www-form-urlencoded”或“multipart / form-data”。错误消息非常误导。


-1
投票

; php.init中的always_populate_raw_post_data = -1删除此行的注释.. always_populate_raw_post_data = -1

© www.soinside.com 2019 - 2024. All rights reserved.