Ostrzeżenie o wycofywaniu „$ HTTP_RAW_POST_DATA”

121

Przerzuciłem się na PHP 5.6.0 i teraz wszędzie dostaję następujące ostrzeżenie:

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

Dobrze, polegam na jakiejś przestarzałej funkcji. Tylko że ja nie!

  1. Nigdy nie użyłem tej zmiennej w żadnym z moich skryptów. Szczerze mówiąc, nie miałem pojęcia, że ​​w ogóle istnieje.
  2. phpinfo()pokazuje, że mam always_populate_raw_post_dataustawione na 0 (wyłączone). Więc, co się dzieje?

Nie chcę „unikać ostrzeżenia”, ustawiając tę ​​wartość na -1. Spowoduje to ukrycie ostrzeżenia i nadal będę mieć przestarzałą konfigurację. Chcę rozwiązać problem u jego źródła i wiedzieć, dlaczego PHP uważa, że HTTP_RAW_POST_DATAwypełnianie jest włączone.

rr-
źródło
Ten sam problem, ale możliwa inna przyczyna / rozwiązanie: stackoverflow.com/questions/25984623/…
rr-
To ostrzeżenie sprawia mi kłopoty podczas uruchamiania handle () PHP SoapServer na PHP> = 5.6. To ostrzeżenie będzie zawsze wyświetlane w odpowiedzi SOAP, więc __soapCall () SoapClient otrzyma wyjątek „SoapFaultception: [Klient] wygląda na to, że nie mamy żadnego dokumentu XML”. Tak trudne do debugowania, ponieważ to ostrzeżenie zwykle się nie pojawia.
Johnny Wong,

Odpowiedzi:

135

Okazuje się, że źle zrozumiałem komunikat o błędzie. Powiedziałbym, że zawiera bardzo słaby dobór słów. Googlowanie po okolicy pokazało mi, że ktoś inny źle zrozumiał wiadomość dokładnie tak, jak ja - zobacz błąd PHP # 66763 .

Po całkowicie niepomocnym „Tak właśnie chcieli RMs”. W odpowiedzi na ten błąd Mike'a, Tyrael wyjaśnia, że ​​ustawienie go na „-1” nie oznacza jedynie ostrzeżenia o zniknięciu. Robi właściwą rzecz , tzn. Całkowicie wyłącza zapełnianie zmiennej winowajcy. Okazuje się, że ustawienie wartości 0 NADAL zapełnia dane w pewnych okolicznościach. Porozmawiaj o złym projekcie! Aby zacytować PHP RFC :

Zmień ustawienie always_populate_raw_post_data INI, aby akceptować trzy wartości zamiast dwóch.

  • -1: zachowanie mistrza; nigdy nie wypełniaj $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / wył. / Cokolwiek: zachowanie BC (wypełnij, jeśli typ zawartości nie jest zarejestrowany lub metoda żądania jest inna niż POST)
  • 1 / on / yes / true: zachowanie BC (zawsze wypełniaj $ GLOBALS [HTTP_RAW_POST_DATA])

Więc tak, ustawienie go na -1 nie tylko pozwala uniknąć ostrzeżenia, jak powiedział komunikat, ale także ostatecznie wyłącza zapełnianie tej zmiennej, o co mi chodziło.

rr-
źródło
23
tl; dr to jest głupie ostrzeżenie, które pojawia się nawet jeśli nie używasz rzeczy, przed którą ostrzega; ustaw always_populate_raw_post_data na -1
srcspider
7
ustawiłem to always_populate_raw_post_data = -1. wciąż nadchodzi ostrzeżenie i
psuje
2
Tak więc odpowiedzią jest przejście do php.inipliku i ustawienie (lub odkomentowanie) always_populate_raw_post_data = -1.
Jan
Ale tak naprawdę nie rozumiem. To jest dokładnie to, co mówi ostrzeżenie? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas
@ Andreas, chodzi o powód, dla którego to mówi, tj. Różnica między 0, które jest najwyraźniej „wyłączone”, a -1, co oznacza… „silniejsze wyłączone”? → zamieszanie → powód tego pytania (i odpowiedzi).
rr-
39

Minęło trochę czasu, zanim natknąłem się na ten błąd. Przedstaw moją odpowiedź każdemu, kto może natknąć się na tę kwestię.

Ten błąd oznacza tylko, że wysyłasz puste żądanie POST. Ten błąd często występuje w żądaniach HTTPRequests bez przekazanych parametrów. Aby uniknąć tego błędu, zawsze możesz dodać parametr do POST bez zmiany pliku php.ini.

Lubić:

$.post(URL_HERE
    ,{addedvar : 'anycontent'}
    ,function(d){
       doAnyHere(d);
    }
    ,'json' //or 'html','text'
);
Jedz Ong
źródło
4
To najlepsza odpowiedź, jaką znalazłem na ten problem! Od miesiąca mam do czynienia z tym problemem z przerwami i sprawił, że spojrzałem w złym kierunku. Po prostu miałem pusty POST w wypadku i kiedy to zostało naprawione, wszystko działało świetnie! Dziękuję za uratowanie mnie od strasznego bólu głowy!
Craig Howell
34

Doświadczyłem tego samego problemu na serwerze nginx (DigitalOcean) - wszystko, co musiałem zrobić, to zalogować się jako rooti zmodyfikować plik /etc/php5/fpm/php.ini.

Aby znaleźć linię z always_populate_raw_post_datapierwszym uruchomieniem grep:

grep -n 'always_populate_raw_post_data' php.ini

To zwróciło linię 704

704:;always_populate_raw_post_data = -1

Następnie po prostu otwórz php.initen wiersz w viedytorze:

vi +704 php.ini

Usuń średnik, aby odkomentować go i zapisz plik :wq

Na koniec zrestartuj serwer i błąd zniknął.

Sebastian Sulinski
źródło
3
Jeśli linia jest zakomentowana w twoim php.ini, prawdopodobnie używasz rozwojowej konfiguracji php.ini.
BadHorsie
13

Jeśli używasz WAMP ...

należy dodać lub odkomentować właściwość always_populate_raw_post_dataw php.inii ustawić jej wartość na -1. W moim przypadku php.iniznajduje się w:

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

... ale jeśli nadal otrzymujesz ostrzeżenie (tak jak ja)

Należy również ustawić always_populate_raw_post_data = -1w phpForApache.ini:

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

Jeśli nie możesz znaleźć tego pliku, otwórz okno przeglądarki i przejdź do:

http://localhost/?phpinfo=1

i poszukaj wartości klucza Loaded Configuration File . W moim przypadku php.iniużywany przez WAMP znajduje się w:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (dowiązanie symboliczne do C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

Na koniec uruchom ponownie WAMP (lub kliknij Uruchom ponownie wszystkie usługi)

Ricardo Tribaldos
źródło
6

Jeśli .htaccessplik nie jest dostępny, utwórz go w folderze głównym i wklej ten wiersz kodu.

Umieść to w .htaccesspliku (testowane działa dobrze dla API)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
Shaan Ansari
źródło
2
proszę wyjaśnij, mój panie
Zohaib
5

Odkomentowanie pliku

always_populate_raw_post_data = -1 

w php.ini (linia nr 703) i ponowne uruchomienie usług APACHE i tak pomoże mi pozbyć się wiadomości

; 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
źródło
4

Dla każdego, kto nadal boryka się z tym problemem po zmianie php.init, jak sugeruje zaakceptowana odpowiedź. Ponieważ błąd występuje, gdy petycja Ajax jest wykonywana POSTbez żadnego parametru, wszystko co musisz zrobić, to zmienić metodę wysyłania na GET.

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

Jeszcze inną opcją, jeśli chcesz zachować metodę POSTz jakiegokolwiek powodu, jest dodanie pustego obiektu JSON do petititon ajax.

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

Otrzymałem ten komunikat o błędzie podczas wysyłania danych z formularza html (metoda Post). Wszystko, co musiałem zrobić, to zmienić kodowanie w formie z „text / plain” na „application / x-www-form-urlencoded” lub „multipart / form-data”. Komunikat o błędzie był bardzo mylący.

user9541305
źródło
3

Niestety ta odpowiedź @EatOng nie jest poprawna . Po przeczytaniu jego odpowiedzi dodałem zmienną fikcyjną do każdego odpalanego żądania AJAX (nawet jeśli niektóre z nich miały już jakieś pola), aby mieć pewność, że błąd nigdy się nie pojawi.

Ale właśnie teraz natrafiłem na ten sam cholerny błąd z PHP. Podwójnie potwierdziłem, że wysłałem trochę danych POST (kilka innych pól wraz ze zmienną fikcyjną). Wersja PHP 5.6.25, always_populate_raw_post_datawartość jest ustawiona na 0.

Ponadto, gdy wysyłam application/jsonżądanie, PHP nie wypełnia go $_POST, a raczej mam do json_decode()surowej treści żądania POST, dostępnej przez php://input.

Jako odpowiedź @ rr- cites,

0 / wył. / Cokolwiek: zachowanie BC (wypełnij, jeśli typ zawartości nie jest zarejestrowany lub metoda żądania jest inna niż POST ).

Ponieważ metoda żądania jest na pewno POST, myślę, że PHP nie rozpoznało / nie polubiło mojego Content-Type: application/jsonżądania (znowu, dlaczego ??).

OPCJA 1:

Edytuj php.iniplik ręcznie i ustaw zmienną winowajcy na-1 , zgodnie z sugestiami wielu odpowiedzi.

OPCJA 2:

To jest błąd PHP 5.6. Zaktualizuj PHP.

OPCJA 3:

Jak odpowiedział @ user9541305, zmiana Content-Typeżądania AJAX na application/x-www-form-urlencodedlub multipart/form-dataspowoduje, że PHP $_POSTwypełni treść z postu POST (ponieważ PHP lubi / rozpoznaje te content-typenagłówki !?).

OPCJA 4: OSTATNI RESORT

Cóż, nie chciałem zmieniać Content-TypeAJAX, spowodowałoby to wiele problemów przy debugowaniu. (Chrome DevTools ładnie wyświetla przesłane zmienne żądań JSON).

Tworzę to dla klienta i nie mogę poprosić go o użycie najnowszego PHP ani o edycję pliku php.ini. W ostateczności sprawdzę tylko, czy jest ustawiony na, 0a jeśli tak, edytuję php.iniplik w samym skrypcie PHP. Oczywiście będę musiał poprosić użytkownika o ponowne uruchomienie Apache. Jaka szkoda!

Oto przykładowy kod:

<?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
źródło
0

Cóż, jeśli jest ktoś na współdzielonym hostingu i nie ma dostępu do php.inipliku, możesz ustawić tę linię kodu na samej górze plików PHP:

ini_set('always_populate_raw_post_data', -1);

Działa bardziej tak samo. Mam nadzieję, że zaoszczędzi to komuś czasu na debugowanie :)

Martins
źródło
0

NB: JEŚLI UŻYWASZ PHPSTORM wprowadź opis obrazu tutaj


Spędziłem godzinę próbując rozwiązać ten problem, myśląc, że to mój problem z serwerem php, więc ustawiłem „always_populate_raw_post_data” na „-1” w php.ini i nic nie działało.

Dopóki nie dowiedziałem się, że używanie wbudowanego serwera phpStorm jest przyczyną problemu, jak opisano szczegółowo w odpowiedzi tutaj: Odpowiedź od LazyOne Tutaj , więc pomyślałem o udostępnieniu go.

KADEM Mohammed
źródło
-1

; always_populate_raw_post_data = -1 w php.init usuń komentarz z tej linii .. always_populate_raw_post_data = -1

Tejaswi Tandel
źródło
4
czy możesz wytłumaczyć?? czemu ? Ponadto sformatuj / wnij poprawnie swój post.
Ravi
-1

Właśnie dostałem rozwiązanie tego problemu od znajomego. powiedział: Dodaj ob_start (); pod Twoim kodem sesji. Możesz dodać exit (); pod nagłówkiem. Spróbowałem i zadziałało. Mam nadzieję że to pomoże

To jest dla tych na wynajętym serwerze hostingowym, którzy nie mają dostępu do pliku php.init.

kjava
źródło