web-dev-qa-db-ja.com

`$ 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

罰金、私はいくつかの廃止予定の機能に依存しています。それ以外は私はしません!

  1. 私は自分のスクリプトでこの変数を使ったことがない。正直なところ、私はそれが存在していることさえわからなかった。
  2. phpinfo()は、always_populate_raw_post_dataを0(無効)に設定したことを示しています。だから何が起こっているの?

この値を-1に設定して「警告を回避する」必要はありません。これは警告を隠すだけです、そして私はまだ廃止予定の設定を持つでしょう。私はその問題をその根源で解決し、PHPがHTTP_RAW_POST_DATAの生成がオンになっていると考える理由を知りたいです。

113
rr-

エラーメッセージに対する私の理解が間違っていたことがわかりました。私はそれが言葉の非常に貧弱な選択を特徴とすると思います。グーグルは私がしたのと全く同じように他の誰かがそのメッセージを誤解していることを私に示した - PHP bug#6676 を見てください。

「これはRMがそれを望んでいた方法です」 Mikeによるそのバグへの応答、Tyraelはそれを "-1"に設定しても去るという警告を出さないと説明しています。それは正しいことを行います。すなわち、それは原因変数の生成を完全に無効にします。 0STILLに設定すると、状況によってはデータが入力されます。悪いデザインについて話す!引用すると PHP RFC

Always_populate_raw_post_data INI設定を変更して、2つではなく3つの値を受け入れます。

  • -1:マスターの振る舞い$ GLOBALS [HTTP_RAW_POST_DATA]に入力しないでください
  • 0/off /何でも:BCの振る舞い(content-typeが登録されていないかリクエストメソッドがPOST以外の場合に生成される)
  • 1/on/yes/true:BCの動作(常に$ GLOBALS [HTTP_RAW_POST_DATA]に入力)

メッセージを言ったように-1に設定すると警告が回避されるだけでなく、最後にこの変数への入力が無効になります

127
rr-

このエラーに遭遇するまでしばらく待ってください。この問題に遭遇するかもしれない人のために私の答えを提出してください。

このエラーは、空のPOST要求を送信していることを意味するだけです。このエラーはHTTPRequestsでパラメータが渡されていない場合によく見られます。このエラーを回避するために、php.iniを変更せずに常にPOSTにパラメータを追加できます。

好きです:

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

私は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を保存するためにセミコロンを削除します。

最後にサーバーを再起動するとエラーは消えました。

32

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 = -1phpForApache.iniに設定する必要があります。

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

このファイルが見つからない場合は、ブラウザウィンドウを開いて次の場所に進みます。

http://localhost/?phpinfo=1

そしてLoaded Configuration File keyの値を探します。私の場合、WAMPが使用しているphp.iniは次の場所にあります。

C:\wamp64\bin\Apache\apache2.4.23\bin\php.ini(C:\ wamp64\bin\php\php5.6.25\phpForApache.iniへのシンボリックリンク)

最後にWAMPを再起動します(またはすべてのサービスを再起動するをクリックします)

12

コメントを解除する

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
Nava Bogatee

.htaccessファイルが利用できない場合は、ルートフォルダにこのコード行を過ぎて作成してください。

これを.htaccessファイルに入れます(APIに対してうまく動作することがテスト済み)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
5
Shaan Ansari

受け入れられた答えが示唆するようにphp.initを変更した後にまだこの問題に苦しんでいる人のために。パラメータなしでPOSTを介してajax請願書が作成されたときにエラーが発生するので、あなたがしなければならないのはsendメソッドをGETに変更することだけです。

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

何らかの理由でメソッドPOSTを保持したい場合のもう1つの選択肢は、空のJSONオブジェクトをajaxのpetititonに追加することです。

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

HTMLフォームからデータを送信するときにこのエラーメッセージが表示されます(Postメソッド)。私がしなければならなかったのは "text/plain"から "application/x-www-form-urlencoded"または "multipart/form-data"への形式のエンコーディングを変更することだけでした。エラーメッセージは非常に誤解を招くものでした。

3
user9541305

共有ホスティング上にphp.iniファイルにアクセスできない人がいる場合、PHPファイルの最上部に次のコード行を設定できます。

ini_set('always_populate_raw_post_data', -1);

同じように機能します。私はそれが誰かのデバッグ時間を節約することを願っています:)

0
Martins

残念ながら、@ EatOngによるこの回答は正しくないです。彼の答えを読んだ後、エラーが表示されないことを確認するために、(一部のフィールドにすでにフィールドが含まれていたとしても)起動するすべてのAJAXリクエストにダミー変数を追加しました。

しかし、たった今、PHPからのとんでもないエラーに出会いました。いくつかのPOSTデータ(ダミー変数とともに他のフィールドも)を送信したことを再確認しました。 PHPバージョン5.6.25always_populate_raw_post_data値は0に設定されます。

また、私はapplication/jsonリクエストを送信しているので、PHPは$_POSTにそれを投入していません。むしろ、json_decode()生POST php://inputでアクセス可能なリクエスト本文。

@rrcitesによる答えとして、

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-urlencodedまたはmultipart/form-dataに変更すると、PHPが$_POSTを生成しますPOSTされた本文から(PHPがそれらのcontent-typeヘッダーを好き/認識するので!?)。

オプション4:最後の解決策

さて、AJAXのContent-Typeを変更したくなかったので、デバッグには多くの問題が発生しました。 (Chrome DevToolsは、JSONリクエストのPOSTされた変数を適切に表示します。)

私はクライアント向けにこのことを開発していますが、最新の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;
}
0
Jay Dadhania