2014-10-31 27 views
10

Recentemente ho aggiornato il mio server di produzione di Ubuntu 14.04 e PHP 5.6, e ora sto ricevendo avvertenze nel mio log di errore:

2014/10/31 10:42:45 [error] 17128#0: *46238 FastCGI sent in stderr: "PHP message: PHP 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" while reading response header from upstream, client: 24.123.216.42, server: example.com, request: "POST /api/notes HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "example.com", referrer: "https://example.com/admin/"

ho read the documentation così come questo un po 'rilevanti domanda: Undefined variable: HTTP_RAW_POST_DATA. Tuttavia, non riesco a capire perché questo avviso viene registrato. Per quanto ne so, non sto usando $HTTP_RAW_POST_DATA in nessuna parte della mia base di codice. Ho provato:

find . -exec grep "HTTP_RAW_POST_DATA" {} \; -print 2>/dev/null 

dalla directory principale del mio progetto (tra cui tutte le directory vendor), ma io non sto trovando alcuna corrispondenza.

I read more about always_populate_raw_post_data e sembra che $HTTP_RAW_POST_DATA debba essere compilato solo se il parametro always_populate_raw_post_data è impostato su TRUE. Ho controllato il mio phpinfo() e il parametro è impostato su 0.

Se non sto invocando esplicitamente $HTTP_RAW_POST_DATA e always_populate_raw_post_data è impostato su 0, perché sto ottenendo questi avvisi nel mio log degli errori? Che cosa fa l'impostazione da always_populate_raw_post_data a -1?

+1

È possibile che sia sepolto nei file di configurazione del server. –

+0

Ci ho pensato. Ho eseguito un 'find/etc/nginx -exec grep" always_populate_raw_post_data "{} \; -print 2>/dev/null' senza risultati. Inoltre, appare come '0' in' phpinfo() '. –

+0

Conosci il trapano, crea un codice minimale che riproduce il problema. –

risposta

9

Ecco the relevant C code con i miei commenti:

static zend_bool populate_raw_post_data(TSRMLS_D) 
{ 
    // not a post, empty request - return FALSE 
    if (!SG(request_info).request_body) { 
     return (zend_bool) 0; 
    } 

    // if always_populate_raw_post_data=0 then 
    // if we don't know how to parse the post (unknown mimetype) return TRUE 
    // otherwise (known mimetype) return FALSE 
    if (!PG(always_populate_raw_post_data)) { 
     return (zend_bool) !SG(request_info).post_entry; 
    } 

    // if always_populate_raw_post_data > 0 return TRUE 
    // if always_populate_raw_post_data < 0 return FALSE 
    return (zend_bool) (PG(always_populate_raw_post_data) > 0); 
} 

Cioè, l'impostazione always_populate_raw_post_data a 0 consente ancora il popolamento per tipi di contenuto sconosciuti. Devi usare un valore negativo per saltare del tutto.

Questo è ora documented nel manuale:

Il metodo preferito per l'accesso ai dati POST prima è php: // input e $ HTTP_RAW_POST_DATA è obsoleto in PHP 5.6.0 in poi. Impostando always_populate_raw_post_data su -1, verrà attivato il nuovo comportamento che verrà implementato in una versione futura di PHP, in cui $ HTTP_RAW_POST_DATA non viene mai definito.

+0

Giuro che la nota sull'impostazione di 'auto_populate_raw_post_data' su' -1' non era nella documentazione di ieri! –

+0

Sì, sembra che la nota sia stata aggiunta in risposta alla segnalazione di bug deW1 menzionata. – georg

+0

sì, ci sono voluti un po 'di tempo per aggiornare i documenti, immagino e non sei stato abbastanza fortunato da controllare questo giorno dopo :) – deW1

4

E 'già stato archiviato come un bug report

Leggi anche this.

In pratica, modificare il valore su -1 e questo risolverà il "problema".

assicurarsi di utilizzare php://input anche leggere più in basso V

penso che sarebbe meglio descrivere ciò che sta realmente accadendo: il E_DEPRECATED verrà generato quando $ HTTP_RAW_POST_DATA è popolata che controllata dal valore di always_populate_raw_post_data (link a http://php.net/manual/en/ini.core.php dove abbiamo già descritto in qual caso sarà $ HTTP_RAW_POST_DATA essere popolata) e di rimuovere il messaggio deprecato fare in modo che non si usa $ HTTP_RAW_POST_DATA ma php: // ingresso allora si può disabilita la popolazione di $ HTTP_RAW_POST_DATA impostando always_populate_raw_post_data su -1, che rimuoverà E_DEPRECATED.

da http://php.net/manual/en/ini.core.php:

Se impostato su TRUE, PHP sarà sempre popolare il $ HTTP_RAW_POST_DATA contenente i dati POST grezzi. In caso contrario, la variabile viene popolata solo quando il tipo MIME dei dati non viene riconosciuto.

Il metodo preferito per accedere ai dati POST non elaborati è php: // input e $ HTTP_RAW_POST_DATA è obsoleto in PHP 5.6.0 in poi. Impostando always_populate_raw_post_data a -1 si attiva il nuovo comportamento che verrà implementato in una versione futura di PHP, in cui $ HTTP_RAW_POST_DATA non viene mai definito.


modifiche per PHP-5.6

riutilizzabile, optioanlly JITty inizializzato php: // ingresso flusso di cambiamento always_populate_raw_post_data impostazione INI di accettare tre valori invece di due.

-1: Il comportamento del comandante; non sempre popolare $ GLOBALS [HTTP_RAW_POST_DATA]

0/off/qualunque cosa: un comportamento aC (popolare se il contenuto-tipo non è registrato o metodo di richiesta è diverso da POST)

1/su/si/vero: comportamento aC (sempre popolare $ GLOBALS [HTTP_RAW_POST_DATA])

+0

La modifica del valore su -1 risolve il problema. – Morgan

Problemi correlati