【问题标题】:Warning about `$HTTP_RAW_POST_DATA` being deprecated关于 `$HTTP_RAW_POST_DATA` 被弃用的警告
【发布时间】:2014-12-03 08:31:53
【问题描述】:

我切换到 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 填充已打开。

【问题讨论】:

  • 同样的问题,但可能的原因/解决方案不同:stackoverflow.com/questions/25984623/…
  • 在 PHP >= 5.6 上运行 PHP SoapServer 的 handle() 时,这个警告给我带来了麻烦。此警告将始终在 SOAP 的响应中输出,因此 SoapClient 的 __soapCall() 将获得“SoapFault 异常:[Client] 看起来我们没有 XML 文档”异常。很难调试,因为这个警告通常不会出现。

标签: php configuration migration


【解决方案1】:

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

这适用于那些在租用的托管服务器上无法访问 php.init 文件的人。

【讨论】:

    【解决方案2】:

    注意:如果您使用的是 PHPSTORM


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

    直到我发现使用内置服务器的 phpStorm 是导致问题的原因,这里的答案中对此进行了详细说明:Answer by LazyOne Here,所以我考虑分享它。

    【讨论】:

      【解决方案3】:

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

      ini_set('always_populate_raw_post_data', -1);
      

      工作原理相同。我希望它可以节省一些调试时间:)

      【讨论】:

        【解决方案4】:

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

        但刚才我遇到了来自 PHP 的同样该死的错误。我再次确认我已经发送了一些 POST 数据(还有一些其他字段以及虚拟变量)。 PHP版本5.6.25always_populate_raw_post_data值设置为0

        另外,当我发送一个application/json 请求时,PHP 不会将它填充到$_POST,而是我必须将json_decode() 原始POST 请求正文,由php://input 访问。

        正如@rr-cites 的回答,

        0/off/whatever:BC 行为(如果内容类型未注册请求方法不是 POST)。

        因为请求方法肯定是 POST,我猜 PHP 没有识别/喜欢我的 Content-Type: application/json 请求(再次,为什么??)。

        选项 1:

        手动编辑php.ini 文件并将罪魁祸首变量设置为-1,正如这里的许多答案所暗示的那样。

        选项 2:

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

        选项 3:

        正如@user9541305 在这里回答的那样,将AJAX 请求的Content-Type 更改为application/x-www-form-urlencodedmultipart/form-data 将使PHP 填充POST 正文中的$_POST(因为PHP 喜欢/识别那些content-type 标头!? )。

        选项 4:最后的手段

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

        我正在为客户开发这个东西,不能要求他们使用最新的 PHP,也不能编辑 php.ini 文件。作为最后的手段,我将检查它是否设置为 0,如果是,则在我的 PHP 脚本本身中编辑 php.ini 文件。当然,我将不得不要求用户重新启动 apache。太可惜了!

        这是一个示例代码:

        <?php
        
        if(ini_get('always_populate_raw_post_data') != '-1')
        {
            // Get the path to php.ini file
            $iniFilePath = php_ini_loaded_file();
        
            // Get the php.ini file content
            $iniContent = file_get_contents($iniFilePath);
        
            // Un-comment (if commented) always_populate_raw_post_data line, and set its value to -1
            $iniContent = preg_replace('~^\s*;?\s*always_populate_raw_post_data\s*=\s*.*$~im', 'always_populate_raw_post_data = -1', $iniContent);
        
            // Write the content back to the php.ini file
            file_put_contents($iniFilePath, $iniContent);
        
            // Exit the php script here
            // Also, write some response here to notify the user and ask to restart Apache / WAMP / Whatever.
            exit;
        }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 你能解释一下吗?为什么 ?此外,请正确格式化/缩进您的帖子。
            【解决方案7】:

            如果.htaccess 文件不可用,请在根文件夹中创建它并越过这行代码。

            将其放入.htaccess 文件中(经测试适用于 API)

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

            【讨论】:

            • 请大神解释一下
            【解决方案8】:

            如果您使用的是 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

            并查找 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(或者点击重启所有服务)

            【讨论】:

              【解决方案9】:

              对于任何在更改 php.init 后仍然在为这个问题苦苦挣扎的人,正如公认的答案所暗示的那样。由于通过POST 不带任何参数的ajax 请愿会发生错误,因此您只需将发送方法更改为GET

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

              如果您出于任何原因想要保留方法 POST,还有一个选择是向 ajax 请求添加一个空的 JSON 对象。

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

              【讨论】:

                【解决方案10】:

                取消注释

                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
                

                【讨论】:

                  【解决方案11】:

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

                  该错误仅表示您正在发送一个空的 POST 请求。此错误通常在未传递参数的 HTTPRequest 上发现。为避免此错误,您始终可以在不更改 php.ini 的情况下向 POST 添加参数。

                  喜欢:

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

                  【讨论】:

                  • 这是我为这个问题找到的最佳答案!我断断续续地处理这个问题一个月了,它让我看错了方向。我只是在事故中收到了一个空帖子,一旦修复,一切都很好!谢谢你让我免于头痛!
                  【解决方案12】:

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

                  然后用vi编辑器在该行打开php.ini

                  vi +704 php.ini
                  

                  去掉分号取消注释并保存文件:wq

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

                  【讨论】:

                  • 如果您的php.ini 中注释掉了该行,您可能正在使用 php.ini 的开发配置。
                  【解决方案13】:

                  原来我对错误信息的理解是错误的。我会说它的单词选择很差。谷歌搜索向我展示了其他人误解了这条消息,就像我一样 - 请参阅PHP bug #66763

                  在完全没有帮助之后“这是 RM 想要的方式。”针对 Mike 的那个错误,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 不仅可以避免警告,就像消息中所说的那样,而且它还最终禁用填充这个变量,这正是我想要的。

                  【讨论】:

                  • tl;dr 这是一个愚蠢的警告,即使你不使用它警告的东西,它也会出现;将 always_populate_raw_post_data 设置为 -1
                  • 我已将其设置为 always_populate_raw_post_data = -1 。现在仍然会发出警告并破坏 json 响应
                  • 所以有效的答案是转到您的php.ini 文件并设置(或取消注释)always_populate_raw_post_data = -1
                  • 但我真的不明白这一点。这正是警告的意思? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
                  • @Andreas 关键是它这么说的原因,即0,显然是“禁用”,和-1,这是......“更强的禁用”? → 困惑 → 这个问题的原因(和答案)。
                  猜你喜欢
                  • 2021-02-19
                  • 2023-03-25
                  • 2015-08-01
                  相关资源
                  最近更新 更多