Avviso riguardo alla deprecazione di "$ HTTP_RAW_POST_DATA"


121

Sono passato a PHP 5.6.0 e ora ricevo il seguente avviso ovunque:

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

Bene, mi affido ad alcune funzionalità deprecate. Tranne che non lo faccio!

  1. Non ho mai usato questa variabile in nessuno dei miei script. Ad essere onesto non avevo nemmeno idea che esistesse.
  2. phpinfo()mostra che ho always_populate_raw_post_dataimpostato a 0 (disabilitato). Quindi che sta succedendo?

Non voglio "evitare l'avviso" impostando questo valore su -1. Questo nasconderà solo l'avviso e avrò ancora una configurazione deprecata. Voglio risolvere il problema alla fonte e sapere perché PHP ritiene che il HTTP_RAW_POST_DATApopolamento sia attivato.


Lo stesso problema, ma possibile causa / soluzione diversa: stackoverflow.com/questions/25984623/…
rr-

Questo avviso mi dà problemi quando eseguo l'handle () di PHP SoapServer su PHP> = 5.6. Questo avviso verrà sempre visualizzato nella risposta di SOAP, in modo che il __soapCall () di SoapClient ottenga un'eccezione "SoapFault: [Client] sembra non aver ricevuto alcun documento XML". È così difficile eseguire il debug perché questo avviso normalmente non verrà visualizzato.
Johnny Wong

Risposte:


135

Si scopre che la mia comprensione del messaggio di errore era sbagliata. Direi che presenta una scelta di parole molto scarsa. Cercare su Google mi ha mostrato che qualcun altro ha frainteso il messaggio esattamente come ho fatto io - vedi bug PHP # 66763 .

Dopo totalmente inutile "Questo è il modo in cui gli RM volevano che fosse". Risposta a quel bug da parte di Mike, Tyrael spiega che impostarlo a "-1" non fa solo l'avvertimento di andare via. Fa la cosa giusta , cioè disabilita completamente il popolamento della variabile colpevole. Risulta che averlo impostato su 0 ANCORA popola i dati in alcune circostanze. Parla di cattivo design! Per citare PHP RFC :

Modifica l'impostazione INI always_populate_raw_post_data per accettare tre valori invece di due.

  • -1: il comportamento del maestro; non popolare mai $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / off / qualunque cosa: comportamento BC (compilare se il tipo di contenuto non è registrato o il metodo di richiesta è diverso da POST)
  • 1 / on / yes / true: comportamento BC (popola sempre $ GLOBALS [HTTP_RAW_POST_DATA])

Quindi sì, impostarlo su -1 non solo evita l'avviso, come diceva il messaggio, ma alla fine disabilita anche il popolamento di questa variabile, che è quello che volevo.


23
tl; dr questo è un avviso stupido che appare anche se non usi la cosa contro cui mette in guardia; imposta always_populate_raw_post_data su -1
srcspider

7
l'ho impostato always_populate_raw_post_data = -1. ancora ora l'avvertimento in arrivo e corrompendo la risposta json
itsazzad

2
Quindi la risposta in effetti è andare al tuo php.inifile e impostare (o rimuovere il commento) always_populate_raw_post_data = -1.
John

Ma non ho davvero capito il punto. È esattamente quello che dice l'avvertimento? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas

@Andreas il punto è il motivo per cui lo dice, cioè la differenza tra 0, che apparentemente è "disabilitato", e -1, che è ... "disabilitato più forte"? → confusione → motivo di questa domanda (e risposta).
rr-

39

È passato un po 'di tempo fino a quando non ho riscontrato questo errore. Metti la mia risposta per chiunque possa incappare in questo problema.

L'errore significa solo che stai inviando una richiesta POST vuota. Questo errore si trova comunemente su HTTPRequests senza parametri passati. Per evitare questo errore, puoi sempre aggiungere un parametro al POST senza modificare il file php.ini.

Piace:

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

4
Questa è la migliore risposta che ho trovato per questo problema! Ho affrontato questo problema continuamente per un mese e mi ha fatto guardare nella direzione sbagliata. Ho semplicemente avuto un POST vuoto per incidente e una volta risolto tutto ha funzionato alla grande! Grazie per avermi salvato da un terribile mal di testa!
Craig Howell

34

Ho riscontrato lo stesso problema sul server nginx (DigitalOcean): tutto quello che dovevo fare era accedere come roote modificare il file /etc/php5/fpm/php.ini.

Per trovare la linea con il always_populate_raw_post_dataprimo corro grep:

grep -n 'always_populate_raw_post_data' php.ini

Quello ha restituito la linea 704

704:;always_populate_raw_post_data = -1

Quindi apri semplicemente php.inisu quella riga con l' vieditor:

vi +704 php.ini

Rimuovere il punto e virgola per decommentarlo e salvare il file :wq

Infine, riavvia il server e l'errore è andato via.


3
Se la riga è commentata nel tuo php.ini, probabilmente stai usando una configurazione di sviluppo di php.ini.
BadHorsie

13

Se stai usando WAMP ...

si dovrebbe aggiungere o rimuovere il commento la proprietà always_populate_raw_post_datanel php.inie impostarne il valore a -1. Nel mio caso php.inisi trova in:

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

..ma se continui a ricevere l'avviso (com'ero io)

È inoltre necessario impostare always_populate_raw_post_data = -1in phpForApache.ini:

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

Se non riesci a trovare questo file, apri una finestra del browser e vai a:

http://localhost/?phpinfo=1

e cerca il valore della chiave del file di configurazione caricato . Nel mio caso quello php.iniutilizzato da WAMP si trova in:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (collegamento simbolico a C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

Infine riavvia WAMP (o fai clic su riavvia tutti i servizi)


6

Se il .htaccessfile non è disponibile, crearlo nella cartella principale e oltre questa riga di codice.

Mettilo nel .htaccessfile (testato che funziona bene per l'API)

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

2
per favore spiega Mio Signore
Zohaib

5

Rimuovere il commento da

always_populate_raw_post_data = -1 

in php.ini (riga # 703) e il riavvio dei servizi APACHE mi aiuta a sbarazzarmi comunque del messaggio

; 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

Per chiunque sia ancora alle prese con questo problema dopo aver modificato php.init come suggerisce la risposta accettata. Poiché l'errore si verifica quando una petizione ajax viene presentata POSTsenza alcun parametro, tutto ciò che devi fare è modificare il metodo di invio in GET.

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

Ancora un'altra opzione se vuoi mantenere il metodo POSTper qualsiasi motivo è aggiungere un oggetto JSON vuoto alla petizione ajax.

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

4

Ho ricevuto questo messaggio di errore durante l'invio di dati da un modulo html (metodo Post). Tutto quello che dovevo fare era cambiare la codifica nel modulo da "text / plain" a "application / x-www-form-urlencoded" o "multipart / form-data". Il messaggio di errore era molto fuorviante.


3

Sfortunatamente, questa risposta qui da @EatOng non è corretta . Dopo aver letto la sua risposta ho aggiunto una variabile fittizia a ogni richiesta AJAX che stavo sparando (anche se alcune di esse avevano già dei campi) solo per essere sicuro che l'errore non comparisse mai.

Ma proprio ora mi sono imbattuto nello stesso dannato errore di PHP. Ho confermato due volte di aver inviato alcuni dati POST (anche altri campi insieme alla variabile fittizia). Versione PHP 5.6.25, il always_populate_raw_post_datavalore è impostato su 0.

Inoltre, poiché sto inviando una application/jsonrichiesta, PHP non la popola $_POST, piuttosto devo al json_decode()corpo della richiesta POST grezzo, accessibile da php://input.

Come risposta di @ rr- cites,

0 / off / qualunque cosa: comportamento BC (compilare se il tipo di contenuto non è registrato o il metodo di richiesta è diverso da POST ).

Poiché il metodo di richiesta è sicuramente POST, immagino che PHP non abbia riconosciuto / apprezzato la mia Content-Type: application/jsonrichiesta (di nuovo, perché ??).

OPZIONE 1:

Modifica il php.inifile manualmente e imposta la variabile colpevole su -1, come suggeriscono molte delle risposte qui.

OPZIONE 2:

Questo è un bug PHP 5.6. Aggiorna PHP.

OPZIONE 3:

Come ha risposto @ user9541305 qui, cambiando la Content-Typerichiesta di AJAX in application/x-www-form-urlencodedo multipart/form-datafarà popolare PHP $_POSTdal corpo POST (perché PHP piace / riconosce quelle content-typeintestazioni !?).

OPZIONE 4: ULTIMO RESORT

Bene, non volevo cambiare il Content-Typedi AJAX, avrebbe causato molti problemi per il debug. (Chrome DevTools visualizza bene le variabili POST delle richieste JSON.)

Sto sviluppando questa cosa per un cliente e non posso chiedergli di usare l'ultima versione di PHP, né di modificare il file php.ini. Come ultima risorsa, controllerò solo se è impostato su 0e, in tal caso, modifico il php.inifile nel mio script PHP stesso. Ovviamente dovrò chiedere all'utente di riavviare apache. Che peccato!

Ecco un codice di esempio:

<?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

Bene, se c'è qualcuno là fuori su un hosting condiviso e senza accesso al php.inifile, puoi impostare questa riga di codice all'inizio dei tuoi file PHP:

ini_set('always_populate_raw_post_data', -1);

Funziona più o meno allo stesso modo. Spero che faccia risparmiare a qualcuno un po 'di tempo per il debug :)


0

NB: SE STAI UTILIZZANDO PHPSTORM inserisci qui la descrizione dell'immagine


Ho passato un'ora a cercare di risolvere questo problema, pensando che fosse il mio problema con il server php, quindi ho impostato 'always_populate_raw_post_data' su '-1' in php.ini e niente ha funzionato.

Fino a quando non ho scoperto che l'utilizzo del server integrato in phpStorm è ciò che causa il problema, come spiegato in dettaglio nella risposta qui: Risposta di LazyOne Qui , quindi ho pensato di condividerlo.


-1

; always_populate_raw_post_data = -1 in php.init rimuovi il commento di questa riga .. always_populate_raw_post_data = -1


4
potresti spiegare?? perché ? Inoltre, formatta / rientra correttamente il tuo post.
Ravi

-1

Ho appena ricevuto la soluzione a questo problema da un amico. ha detto: Aggiungi ob_start (); sotto il codice della sessione. Puoi aggiungere exit (); sotto l'intestazione. L'ho provato e ha funzionato. Spero che questo ti aiuti

Questo è per quelli su un server di hosting in affitto che non hanno accesso al file php.init.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.