私は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
罰金、私はいくつかの廃止予定の機能に依存しています。それ以外は私はしません!
phpinfo()
は、always_populate_raw_post_data
を0(無効)に設定したことを示しています。だから何が起こっているの?この値を-1に設定して「警告を回避する」必要はありません。これは警告を隠すだけです、そして私はまだ廃止予定の設定を持つでしょう。私はその問題をその根源で解決し、PHPがHTTP_RAW_POST_DATA
の生成がオンになっていると考える理由を知りたいです。
エラーメッセージに対する私の理解が間違っていたことがわかりました。私はそれが言葉の非常に貧弱な選択を特徴とすると思います。グーグルは私がしたのと全く同じように他の誰かがそのメッセージを誤解していることを私に示した - 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に設定すると警告が回避されるだけでなく、最後にこの変数への入力が無効になります。
このエラーに遭遇するまでしばらく待ってください。この問題に遭遇するかもしれない人のために私の答えを提出してください。
このエラーは、空のPOST要求を送信していることを意味するだけです。このエラーはHTTPRequestsでパラメータが渡されていない場合によく見られます。このエラーを回避するために、php.iniを変更せずに常にPOSTにパラメータを追加できます。
好きです:
$.post(URL_HERE
,{addedvar : 'anycontent'}
,function(d){
doAnyHere(d);
}
,'json' //or 'html','text'
);
私は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
を保存するためにセミコロンを削除します。
最後にサーバーを再起動するとエラーは消えました。
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 keyの値を探します。私の場合、WAMPが使用している
php.ini
は次の場所にあります。
C:\wamp64\bin\Apache\apache2.4.23\bin\php.ini
(C:\ wamp64\bin\php\php5.6.25\phpForApache.iniへのシンボリックリンク)
最後にWAMPを再起動します(またはすべてのサービスを再起動するをクリックします)
コメントを解除する
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
.htaccess
ファイルが利用できない場合は、ルートフォルダにこのコード行を過ぎて作成してください。
これを.htaccess
ファイルに入れます(APIに対してうまく動作することがテスト済み)
<IfModule mod_php5.c>
php_value always_populate_raw_post_data -1
</IfModule>
受け入れられた答えが示唆するように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,
});
HTMLフォームからデータを送信するときにこのエラーメッセージが表示されます(Postメソッド)。私がしなければならなかったのは "text/plain"から "application/x-www-form-urlencoded"または "multipart/form-data"への形式のエンコーディングを変更することだけでした。エラーメッセージは非常に誤解を招くものでした。
共有ホスティング上にphp.ini
ファイルにアクセスできない人がいる場合、PHPファイルの最上部に次のコード行を設定できます。
ini_set('always_populate_raw_post_data', -1);
同じように機能します。私はそれが誰かのデバッグ時間を節約することを願っています:)
残念ながら、@ EatOngによるこの回答は正しくないです。彼の答えを読んだ後、エラーが表示されないことを確認するために、(一部のフィールドにすでにフィールドが含まれていたとしても)起動するすべてのAJAXリクエストにダミー変数を追加しました。
しかし、たった今、PHPからのとんでもないエラーに出会いました。いくつかのPOSTデータ(ダミー変数とともに他のフィールドも)を送信したことを再確認しました。 PHPバージョン5.6.25
、always_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;
}