Warnung, dass "$ HTTP_RAW_POST_DATA" veraltet ist

121

Ich habe auf PHP 5.6.0 umgestellt und bekomme jetzt überall folgende Warnung:

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

Gut, ich verlasse mich auf eine veraltete Funktion. Nur dass ich es nicht tue!

  1. Ich habe diese Variable noch nie in einem meiner Skripte verwendet. Um ehrlich zu sein, hatte ich keine Ahnung, dass es überhaupt existiert.
  2. phpinfo()zeigt, dass ich always_populate_raw_post_dataauf 0 gesetzt habe (deaktiviert). Also, was ist los?

Ich möchte die Warnung nicht vermeiden, indem ich diesen Wert auf -1 setze. Dadurch wird nur die Warnung ausgeblendet, und die Konfiguration ist weiterhin veraltet. Ich möchte das Problem an der Quelle lösen und wissen, warum PHP glaubt, dass das Auffüllen aktiviert HTTP_RAW_POST_DATAist.

rr-
quelle
Das gleiche Problem, aber möglicherweise unterschiedliche Ursache / Lösung: stackoverflow.com/questions/25984623/…
rr-
Diese Warnung bereitet mir Probleme beim Ausführen von PHP SoapServer handle () unter PHP> = 5.6. Diese Warnung wird immer in der Antwort von SOAP ausgegeben, sodass __soapCall () eines SoapClient die Ausnahme "SoapFault-Ausnahme: [Client] sieht so aus, als hätten wir kein XML-Dokument" erhalten. So schwer zu debuggen, weil diese Warnung normalerweise nicht angezeigt wird.
Johnny Wong

Antworten:

135

Es stellt sich heraus, dass mein Verständnis der Fehlermeldung falsch war. Ich würde sagen, es bietet eine sehr schlechte Wortwahl. Das Googeln hat mir gezeigt, dass jemand anderes die Nachricht genauso missverstanden hat wie ich - siehe PHP-Fehler # 66763 .

Nach völlig wenig hilfreich "So wollten es die RMs." Als Antwort auf diesen Fehler von Mike erklärt Tyrael, dass das Setzen auf "-1" nicht nur die Warnung ist, wegzugehen. Es macht das Richtige , dh es deaktiviert das Auffüllen der Tätervariablen vollständig. Es stellt sich heraus, dass die Einstellung auf 0 STILL unter bestimmten Umständen Daten auffüllt . Sprechen Sie über schlechtes Design! So zitieren Sie PHP RFC :

Ändern Sie die INI-Einstellung always_populate_raw_post_data so, dass drei statt zwei Werte akzeptiert werden.

  • -1: Das Verhalten des Meisters; Füllen Sie niemals $ GLOBALS [HTTP_RAW_POST_DATA] aus
  • 0 / off / was auch immer: BC-Verhalten (füllen, wenn der Inhaltstyp nicht registriert ist oder die Anforderungsmethode nicht POST ist)
  • 1 / on / yes / true: BC-Verhalten (immer $ GLOBALS [HTTP_RAW_POST_DATA] ausfüllen)

Wenn Sie also auf -1 setzen, wird nicht nur die Warnung vermieden, wie in der Nachricht angegeben, sondern es wird auch das Auffüllen dieser Variablen deaktiviert , was ich wollte.

rr-
quelle
23
tl; dr dies ist eine stumme Warnung , dass selbst wenn Sie die Sache , die es gegen warnt verwenden nicht erscheint; setze always_populate_raw_post_data auf -1
srcspider
7
Ich habe es eingestellt always_populate_raw_post_data = -1. noch jetzt kommt die Warnung und korrumpiert die json Antwort
itsazzad
2
Die Antwort lautet also, in Ihre php.iniDatei zu gehen und zu setzen (oder zu kommentieren) always_populate_raw_post_data = -1.
John
Aber ich verstehe den Punkt nicht wirklich. Das ist genau das, was die Warnung zu sagen hat ? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas
@Andreas der Punkt ist der Grund, warum es sagt, dass, dh die Differenz zwischen 0, die anscheinend "deaktiviert" ist, und -1, die ... "stärker deaktiviert" ist? → Verwirrung → Grund für diese Frage (und Antwort).
rr-
39

Es ist eine Weile her, bis ich auf diesen Fehler stieß. Stellen Sie meine Antwort für jeden auf, der über dieses Problem stolpern könnte.

Der Fehler bedeutet nur, dass Sie eine leere POST-Anfrage senden. Dieser Fehler tritt häufig bei HTTPRequests auf, bei denen keine Parameter übergeben wurden. Um diesen Fehler zu vermeiden, können Sie dem POST jederzeit einen Parameter hinzufügen, ohne die php.ini zu ändern.

Mögen:

$.post(URL_HERE
    ,{addedvar : 'anycontent'}
    ,function(d){
       doAnyHere(d);
    }
    ,'json' //or 'html','text'
);
Iss Ong
quelle
4
Dies ist die beste Antwort, die ich für dieses Problem gefunden habe! Ich beschäftige mich seit einem Monat immer wieder mit diesem Problem und habe in die falsche Richtung geschaut. Ich hatte einfach einen leeren POST bei einem Unfall und als das behoben war, funktionierte alles super! Danke, dass du mich vor schrecklichen Kopfschmerzen bewahrt hast!
Craig Howell
34

Auf dem Nginx-Server (DigitalOcean) trat das gleiche Problem auf. Ich musste mich lediglich als anmelden rootund die Datei ändern /etc/php5/fpm/php.ini.

So finden Sie die Zeile mit dem always_populate_raw_post_dataich zuerst laufe grep:

grep -n 'always_populate_raw_post_data' php.ini

Das gab die Linie zurück 704

704:;always_populate_raw_post_data = -1

Dann öffnen Sie einfach php.iniin dieser Zeile mit dem viEditor:

vi +704 php.ini

Entfernen Sie das Semikolon, um es zu kommentieren und die Datei zu speichern :wq

Zuletzt den Server neu starten und der Fehler behoben.

Sebastian Sulinski
quelle
3
Wenn die Zeile in Ihrer php.iniauskommentiert ist, verwenden Sie wahrscheinlich eine Entwicklungskonfiguration von php.ini.
BadHorsie
13

Wenn Sie WAMP verwenden ...

Sie sollten die Eigenschaft hinzufügen oder Kommentar- always_populate_raw_post_datain php.iniund seinen Wert auf -1. In meinem Fall php.inibefindet sich in:

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

..aber wenn du immer noch die Warnung bekommst (wie ich war)

Sie sollten auch festgelegt always_populate_raw_post_data = -1in phpForApache.ini:

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

Wenn Sie diese Datei nicht finden können, öffnen Sie ein Browserfenster und gehen Sie zu:

http://localhost/?phpinfo=1

und suchen Sie nach dem Wert des Schlüssels für die geladene Konfigurationsdatei . In meinem Fall befindet sich die php.inivon WAMP verwendete in:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (Symlink zu C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

Starten Sie schließlich WAMP neu (oder klicken Sie auf Alle Dienste neu starten).

Ricardo Tribaldos
quelle
6

Wenn die .htaccess Datei nicht verfügbar ist, erstellen Sie sie im Stammordner und hinter dieser Codezeile.

Legen Sie dies in eine .htaccessDatei (getestet gut funktioniert für API)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
Shaan Ansari
quelle
2
Bitte erklären Sie My Lord
Zohaib
5

Kommentar aus dem

always_populate_raw_post_data = -1 

In der php.ini (Zeile 703) und beim Neustart der APACHE-Dienste kann ich die Nachricht trotzdem entfernen

; 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
Nava Bogatee
quelle
4

Für alle, die nach dem Ändern der php.init noch mit diesem Problem zu kämpfen haben, wie die akzeptierte Antwort nahelegt. Da der Fehler auftritt, wenn eine Ajax-Petition POSTohne Parameter eingereicht wird , müssen Sie lediglich die Sendemethode in ändern GET.

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

Eine weitere Option, wenn Sie die Methode POSTaus irgendeinem Grund beibehalten möchten, ist das Hinzufügen eines leeren JSON-Objekts zur Ajax-Petition.

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

Ich habe diese Fehlermeldung beim Senden von Daten aus einem HTML-Formular (Post-Methode) erhalten. Ich musste lediglich die Codierung im Formular von "text / plain" in "application / x-www-form-urlencoded" oder "multipart / form-data" ändern. Die Fehlermeldung war sehr irreführend.

user9541305
quelle
2

Leider ist diese Antwort hier von @EatOng nicht korrekt . Nachdem ich seine Antwort gelesen hatte, fügte ich jeder AJAX-Anfrage, die ich auslöste, eine Dummy-Variable hinzu (auch wenn einige bereits Felder hatten), um sicherzugehen, dass der Fehler nie auftritt.

Aber gerade jetzt bin ich auf den gleichen verdammten Fehler von PHP gestoßen. Ich habe doppelt bestätigt, dass ich einige POST-Daten gesendet habe (einige andere Felder zusammen mit der Dummy-Variablen). PHP-Version 5.6.25, always_populate_raw_post_dataWert ist auf gesetzt0 .

Während ich eine application/jsonAnfrage sende , füllt PHP sie nicht an $_POST, sondern muss an json_decode()den POST-Anfragetext, auf den über zugegriffen werden kann php://input.

Wie die Antwort von @ rrcites lautet,

0 / aus / was auch immer: BC-Verhalten (füllen, wenn der Inhaltstyp nicht registriert ist oder die Anforderungsmethode nicht POST ist ).

Da die Anforderungsmethode sicher POST ist, hat PHP meine wohl nicht erkannt / gemocht Content-Type: application/json Anfrage gemocht (wieder, warum?).

OPTION 1:

Bearbeiten Sie die php.iniDatei manuell und setzen Sie die Tätervariable auf-1 , wie viele der Antworten hier vermuten lassen.

OPTION 2:

Dies ist ein PHP 5.6-Fehler. Aktualisieren Sie PHP.

OPTION 3:

Wie @ user9541305 hier antwortete, führt das Ändern der Content-TypeAJAX-Anforderung zu application/x-www-form-urlencodedoder multipart/form-dataführt dazu, dass PHP $_POSTden POST-Text ausfüllt (weil PHP diese content-typeHeader mag / erkennt !?).

OPTION 4: LETZTE RESORT

Nun, ich wollte das Content-Typevon AJAX nicht ändern , es würde eine Menge Probleme beim Debuggen verursachen. (Chrome DevTools zeigt die POST-Variablen von JSON-Anforderungen gut an.)

Ich entwickle dieses Ding für einen Client und kann ihn nicht bitten, das neueste PHP zu verwenden oder die Datei php.ini zu bearbeiten. Als letzten Ausweg werde ich nur prüfen, ob es eingestellt ist, 0und wenn ja, das bearbeitenphp.ini Datei in meinem PHP-Skript selbst . Natürlich muss ich den Benutzer bitten, Apache neu zu starten. Schade!

Hier ist ein Beispielcode:

<?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;
}
Jay Dadhania
quelle
0

Wenn sich jemand auf einem gemeinsam genutzten Hosting befindet und keinen Zugriff auf php.iniDateien hat, können Sie diese Codezeile ganz oben in Ihren PHP-Dateien festlegen:

ini_set('always_populate_raw_post_data', -1);

Funktioniert eher gleich. Ich hoffe, es spart jemandem etwas Debugging-Zeit :)

Martins
quelle
0

NB: WENN SIE PHPSTORM VERWENDEN Geben Sie hier die Bildbeschreibung ein


Ich verbrachte eine Stunde versucht , dieses Problem zu lösen, zu denken , dass es mein PHP - Server - Problem war, so dass ich gesetzt ‚always_populate_raw_post_data‘ auf ‚-1‘ in der php.ini und nichts funktionierte.

Bis ich herausfand, dass die Verwendung des in phpStorm integrierten Servers das Problem verursacht, wie in der Antwort hier beschrieben: Antwort von LazyOne Here , also habe ich darüber nachgedacht, es zu teilen.

KADEM Mohammed
quelle
-1

;; always_populate_raw_post_data = -1 in php.init Kommentar dieser Zeile entfernen .. always_populate_raw_post_data = -1

Tejaswi Tandel
quelle
4
könntest du erklären?? Warum ? Formatieren / rücken Sie Ihren Beitrag außerdem richtig ein.
Ravi
-1

Ich habe gerade die Lösung für dieses Problem von einem Freund bekommen. er sagte: Füge ob_start () hinzu; unter Ihrem Sitzungscode. Sie können exit () hinzufügen; unter der Überschrift. Ich habe es versucht und es hat funktioniert. Hoffe das hilft

Dies ist für diejenigen auf einem gemieteten Hosting-Server, die keinen Zugriff auf die Datei php.init haben.

kjava
quelle