`$ HTTP_RAW_POST_DATA`が廃止されることに関する警告


121

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_data0(無効)に設定したことを示しています。それで、何が起こっているのですか?

この値を-1に設定して「警告を回避」したくありません。これは警告を非表示にするだけで、私はまだ非推奨の構成を持っています。私は問題をその根源で解決し、PHP HTTP_RAW_POST_DATAが生成がオンになっていると考える理由を知りたいです。


同じ問題が、可能な異なる原因/解決策:stackoverflow.com/questions/25984623/...
RR-

この警告は、PHP 5.6以上でPHP SoapServerのhandle()を実行すると問題が発生します。この警告は常にSOAPの応答で出力されるため、SoapClientの__soapCall()は「SoapFault例外:[クライアント]はXMLドキュメントがないように見えます」という例外を受け取ります。この警告は通常は表示されないため、デバッグが困難です。
ジョニー・ウォン

回答:


135

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

まったく役に立たなかった後、「これはRMが望んでいた方法です」Tyraelは、マイクによるそのバグへの対応として、「-1」に設定しても警告が消えるわけではないと説明しています。これは正しいことを行います。つまり、原因となる変数への入力を完全に無効にします。これを0に設定すると、状況によってはデータが入力されることがわかります。悪いデザインについて話してください!PHP RFCを引用するには:

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

  • -1:マスターの動作。$ GLOBALS [HTTP_RAW_POST_DATA]を入力しないでください
  • 0 / off / whatever:BCの動作(content-typeが登録されていない場合、またはリクエストメソッドがPOST以外の場合に入力)
  • 1 / on / yes / true:BCの動作(常に$ GLOBALS [HTTP_RAW_POST_DATA]に入力)

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


23
tl; drこれは、警告するものを使用しなくても表示される馬鹿げた警告です。always_populate_raw_post_dataを-1に設定
srcspider

7
私はそれを設定しましたalways_populate_raw_post_data = -1。まだ今警告が来てjson応答を破壊しています
itsazzad '28 / 07/15

2
したがって、実際の答えは、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

@Andreasポイントは、それがそのように言う理由です。つまり、明らかに「無効」である0と-1である...「より強力な無効」の違いは?→混乱→この質問の理由(および回答)。
rr- 2016年

39

私がこのエラーに遭遇するまでしばらくしました。この問題に出くわす可能性のある人のために私の答えを上げてください。

このエラーは、空のPOSTリクエストを送信していることを意味するだけです。このエラーは通常、パラメータが渡されていないHTTPRequestで見られます。このエラーを回避するには、php.iniを変更せずに、常にPOSTにパラメーターを追加します。

お気に入り:

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

4
これが私がこの問題について見つけた最良の答えです!私は1か月間この問題に対処してきましたが、間違った方向を見ていました。事故で空のPOSTが発生し、それが修正されると、すべてがうまくいきました!ひどい頭痛から救ってくれてありがとう!
クレイグハウエル

34

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.iniviエディターでその行を開くだけです。

vi +704 php.ini

セミコロンを削除してコメントを外し、ファイルを保存します :wq

最後にサーバーを再起動すると、エラーはなくなりました。


3
この行がコメント化されているphp.ini場合は、php.iniの開発設定を使用している可能性があります。
BadHorsie、2015

13

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キーの値を探します。私の場合、php.iniWAMPで使用されるファイルは次の場所にあります。

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

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


6

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

これを.htaccessファイルに入れます(APIでテスト済み)

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

2
私の主を説明してください
Zohaib

5

コメントを外します

always_populate_raw_post_data = -1 

php.ini(line#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

4

受け入れられた答えが示唆するようにphp.initを変更した後もまだこの問題に苦労している人にとっては。POSTパラメータなしでajax請願が行われるとエラーが発生するため、送信メソッドをに変更するだけですGET

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

POST何らかの理由でメソッドを保持したい場合のもう1つのオプションは、空のJSONオブジェクトをajaxペティトンに追加することです。

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

4

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


2

残念ながら、この@EatOngによる回答は正しくありません。彼の答えを読んだ後、エラーが表示されないことを確認するために、私が発射していたすべてのAJAX要求にダミー変数を追加しました(それらのいくつかにすでにいくつかのフィールドがあったとしても)。

しかし、ちょうど今、私はPHPから同じいまいましいエラーに出くわしました。いくつかのPOSTデータ(ダミー変数と共に他のいくつかのフィールドも)を送信したことを二重に確認しました。PHPバージョン5.6.25always_populate_raw_post_data値はに設定され0ます。

また、application/jsonリクエストを送信しているので、PHPはにデータを入力していません$_POST。代わりにjson_decode()、からアクセス可能な生のPOSTリクエスト本文を入力する必要がありますphp://input

@ rr-の回答として、

0 / off / whatever:BCの動作(content-typeが登録されていない場合、またはリクエストメソッドがPOST以外の場合に入力します)。

リクエストメソッドは確かにPOSTであるため、PHPはContent-Type: application/jsonリクエストを認識しませんでした(同様に、なぜですか?)。

オプション1:

ここでの回答の多くが示唆するように、php.iniファイルを手動で編集し、犯人変数をに設定-1します。

オプション2:

これはPHP 5.6のバグです。PHPをアップグレードします。

オプション3:

@ user9541305が変化し、ここで答えたようContent-TypeにAJAXリクエストのをapplication/x-www-form-urlencodedまたはmultipart/form-data移入PHPを行います$_POST投稿者の体から(PHPが好きなので、/それらの認識content-typeヘッダを!?)。

オプション4:最後の手段

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

私はクライアントのためにこれを開発しており、最新のPHPを使用するように依頼することも、php.iniファイルを編集することもできません。最後の手段として、設定され0ているかどうかを確認し、設定されている場合php.iniは、PHPスクリプト自体でファイルを編集します。もちろん、ユーザーに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

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

ini_set('always_populate_raw_post_data', -1);

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


0

注意:PHPSTORMを使用している場合 ここに画像の説明を入力してください


私はこの問題を解決するために1時間費やしましたが、これは私のphpサーバーの問題であると考えていたため、php.iniで「always_populate_raw_post_data」「-1」に設定も何も機能しませんでした。

ここに答えで詳述されているように、サーバーに組み込まれたphpStormを使用することが問題の原因であることがわかるまで、ここLazyOneによる回答を共有することを考えました。


-1

; php.initのalways_populate_raw_post_data = -1この行のコメントを削除.. always_populate_raw_post_data = -1


4
説明できますか?どうして ?また、投稿を適切にフォーマット/インデントします。
Ravi

-1

友人からこの問題の解決策をもらいました。彼は言った:ob_start(); セッションコードの下。exit();を追加できます。ヘッダーの下。試してみましたが、うまくいきました。お役に立てれば

これは、php.initファイルにアクセスできないレンタルホスティングサーバーのユーザー向けです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.