it-swarm.com.de

Warnung, dass "$ HTTP_RAW_POST_DATA" veraltet ist

Ich habe auf PHP 5.6.0 umgestellt und bekomme jetzt überall die 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 ein veraltetes Feature. Außer dass ich nicht!

  1. Ich habe diese Variable noch nie in einem meiner Skripte verwendet. Ehrlich gesagt hatte ich keine Ahnung, dass es überhaupt existiert.
  2. phpinfo() zeigt an, dass ich always_populate_raw_post_data auf 0 gesetzt habe (deaktiviert). Also, was ist los?

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

116
rr-

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

Nach völlig hilflosem "So wollten es die RMs." Als Antwort auf diesen Fehler von Mike erklärt Tyrael, dass das Setzen auf "-1" nicht nur die Warnung zum Verschwinden bringt. Es führt das Richtige aus, d. H. Es deaktiviert das Auffüllen der Tätervariablen vollständig. Es stellt sich heraus, dass Daten unter bestimmten Umständen gefüllt werden, wenn der Wert auf 0 [~ # ~] gesetzt ist. [~ # ~] Sprechen Sie über schlechtes Design! So zitieren Sie PHP RFC :

Ändern Sie always_populate_raw_post_data INI), um drei Werte anstelle von zwei zu akzeptieren.

  • -1: Das Verhalten des Meisters; füllen Sie niemals $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0/off/whatever: BC-Verhalten (ausfü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 den Wert auf -1 setzen, wird nicht nur die Warnung vermieden, wie in der Meldung angegeben, sondern auch das endgültige Deaktivieren Auffüllen dieser Variablen, was ich wollte.

130
rr-

Es dauerte eine Weile, bis ich auf diesen Fehler stieß. Stellen Sie meine Antwort für alle auf, die über dieses Problem stolpern könnten.

Der Fehler bedeutet nur, dass Sie eine leere POST - Anforderung 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 immer 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'
);
36
Eat Ong

Ich hatte das gleiche Problem auf dem Nginx-Server (DigitalOcean) - alles, was ich tun musste, war mich als root anzumelden und die Datei /etc/php5/fpm/php.ini Zu ändern.

Um die Zeile mit dem always_populate_raw_post_data Zu finden, führe ich zuerst grep aus:

grep -n 'always_populate_raw_post_data' php.ini

Das ergab die Zeile 704

704:;always_populate_raw_post_data = -1

Dann öffnen Sie einfach php.ini In dieser Zeile mit dem vi Editor:

vi +704 php.ini

Entfernen Sie das Semikolon, um das Kommentarzeichen zu entfernen und die Datei zu speichern :wq

Zuletzt starten Sie den Server neu und der Fehler ist behoben.

32

Wenn Sie WAMP ... verwenden.

sie sollten die Eigenschaft always_populate_raw_post_data in php.ini hinzufügen oder auskommentieren und ihren Wert auf -1 setzen. In meinem Fall befindet sich php.ini In:

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

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

Sie sollten auch always_populate_raw_post_data = -1 In phpForApache.ini setzen:

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 von Loaded Configuration File key. In meinem Fall befindet sich das von WAMP verwendete php.ini In:

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

Schließlich starten Sie WAMP neu (oder klicken Sie auf Alle Dienste neu starten)

12

Auskommentieren der

always_populate_raw_post_data = -1 

in der php.ini (Zeile # 703) und beim Neustart der Apache-Dienste kann ich die Nachricht trotzdem loswerden

; 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

Wenn der .htaccess Datei nicht verfügbar Erstelle sie im Root-Ordner und hinter dieser Codezeile.

Setzen Sie dies in .htaccess Datei (getestet, funktioniert gut für API)

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

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

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

Eine weitere Option, wenn Sie die Methode POST aus 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,
});
4
Grirg

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

3
user9541305

Nun, wenn es irgendjemanden auf einem Shared Hosting gibt, der keinen Zugriff auf die php.ini - Datei hat, können Sie diese Codezeile ganz oben in Ihren PHP) - Dateien setzen:

ini_set('always_populate_raw_post_data', -1);

Funktioniert eher gleich. Ich hoffe, es spart jemandem etwas Zeit beim Debuggen :)

0
Martins

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 von ihnen bereits einige Felder hatten), nur um sicherzugehen, dass der Fehler nie auftritt.

Aber gerade bin ich auf den gleichen verdammten Fehler von PHP gestoßen. Ich habe zweimal 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_data_ Wert ist auf _0_ gesetzt.

Wenn ich eine _application/json_ -Anforderung sende, füllt PHP sie nicht in _$_POST_ auf, sondern ich muss json_decode() das rohe POST Anfragetext, zugänglich über _php://input_.

Wie die Antwort von @ rr- zitiert,

0/off/whatever: BC-Verhalten (ausfüllen, wenn Inhaltstyp nicht registriert ist oder Anforderungsmethode ist anders als POST).

Da es sich bei der Anforderungsmethode mit Sicherheit um POST handelt, hat wohl PHP meine _Content-Type: application/json_ -Anforderung nicht erkannt/gemocht (noch einmal, warum ??).

OPTION 1:

Bearbeiten Sie die Datei _php.ini_ manuell und setzen Sie die Tätervariable auf _-1_, wie in vielen Antworten hier vorgeschlagen.

OPTION 2:

Dies ist ein PHP 5.6 Fehler. Aktualisieren Sie PHP.

OPTION 3:

Wenn @ user9541305 hier geantwortet hat und die Anforderung _Content-Type_ von AJAX in _application/x-www-form-urlencoded_ oder _multipart/form-data_ geändert wird, wird PHP das _$_POST_ ausfüllen. aus dem POSTed Body (weil PHP diese _content-type_ Header mag/erkennt !?).

OPTION 4: LAST RESORT

Nun, ich wollte den _Content-Type_ von AJAX nicht ändern, es würde eine Menge Ärger beim Debuggen verursachen. (Chrome DevTools zeigt die POST-Variablen von JSON-Anforderungen an.)

Ich entwickle diese Sache für einen Klienten und kann sie nicht bitten, spätestes PHP zu benutzen, noch die php.ini Akte zu redigieren. Als letzte Möglichkeit überprüfe ich nur, ob _0_ eingestellt ist, und bearbeite in diesem Fall die _php.ini_ -Datei in meinem PHP -Skript. 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;
}
_
0
Jay Dadhania