2014-10-31 16 views
10

Ostatnio zwiększyłem mój serwer produkcyjny do Ubuntu 14.04 i PHP 5.6, a teraz dostaję ostrzeżenia w moim dzienniku błędów:

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/"

I read the documentation jak to nieco istotne pytanie: Undefined variable: HTTP_RAW_POST_DATA. Nie mogę jednak zrozumieć, dlaczego to ogłoszenie jest rejestrowane. O ile mogę powiedzieć, nie używam $HTTP_RAW_POST_DATA w mojej bazie kodu. Próbowałem:

z katalogu głównego mojego projektu (w tym wszystkie katalogi dostawców), ale nie znajduję żadnych dopasowań.

I read more about always_populate_raw_post_data i wydaje się, że $HTTP_RAW_POST_DATA należy wypełnić tylko wtedy, gdy parametr always_populate_raw_post_data jest ustawiony na PRAWDA. Sprawdziłem mój phpinfo() a parametr jest ustawiony na 0.

Jeśli nie jestem wyraźnie powołując $HTTP_RAW_POST_DATA i always_populate_raw_post_data jest ustawiony na 0, dlaczego ja się tych zawiadomień w moim dzienniku błędów? Do czego służy ustawienie always_populate_raw_post_data do -1?

+1

Możliwe, że jest pochowany w plikach konfiguracyjnych serwera. –

+0

Myślałem o tym. Uruchomiłem 'find/etc/nginx -exec grep" always_populate_raw_post_data "{} \; -print 2>/dev/null' bez wyników. Ponadto pojawia się jako '0' w' phpinfo() '. –

+0

Znasz wiertło, utwórz minimalny kod, który powiela problem. –

Odpowiedz

9

Oto the relevant C code z moich uwag:

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); 
} 

oznacza to, że ustawienie always_populate_raw_post_data do 0 nadal włącza zapełnianie nieznanych typów treści. Musisz użyć wartości ujemnej, aby ominąć go całkowicie.

Jest teraz documented w instrukcji:

Korzystna metoda dostępu do nieprzetworzonych danych POST jest php: // input i $ HTTP_RAW_POST_DATA jest przestarzałe w PHP 5.6.0 r. Ustawienie always_populate_raw_post_data na -1 spowoduje włączenie nowego zachowania, które zostanie zaimplementowane w przyszłej wersji PHP, w której $ HTTP_RAW_POST_DATA nigdy nie zostanie zdefiniowane.

+0

Przysięgam, że notatka o ustawieniu 'auto_populate_raw_post_data' na' -1' nie była wczoraj w dokumentach! –

+0

Tak, wygląda na to, że notatka została dodana w odpowiedzi na zgłoszony błąd deW1. – georg

+0

tak trwało trochę czasu, zanim dokumenty zaktualizowały się, a Ty nie miałeś szczęścia, by to sprawdzić 1 dzień później :) – deW1

4

To już złożony jako bug report

także czytać this.

Zasadniczo zmień wartość na -1 i to naprawi twój "problem".

Również upewnić się użyć php://input czytaj więcej poniżej V

myślę, że byłoby lepiej, aby opisać to, co się rzeczywiście dzieje: zostanie wygenerowany E_DEPRECATED gdy $ HTTP_RAW_POST_DATA jest wypełniana które kontrolowane przez wartość z always_populate_raw_post_data (link do http://php.net/manual/en/ini.core.php gdzie już opisać takim przypadku będzie $ HTTP_RAW_POST_DATA być wypełniona) i usunięcia przestarzałej wiadomość upewnij się, że nie używasz $ HTTP_RAW_POST_DATA ale php: // input następnie można wyłącz populację $ HTTP_RAW_POST_DATA poprzez ustawienie always_populate_raw_post_data na -1, , co spowoduje usunięcie E_DEPRECATED.

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

Jeśli ma wartość true, PHP będzie zawsze wypełnienia pól $ HTTP_RAW_POST_DATA zawierające surowe dane POST. W przeciwnym razie zmienna zostanie wypełniona tylko wtedy, gdy typ MIME danych nie zostanie rozpoznany.

Preferowaną metodą uzyskiwania dostępu do surowych danych POST jest php: // input, a $ HTTP_RAW_POST_DATA jest przestarzałe w PHP od wersji 5.6.0. Ustawienie always_populate_raw_post_data na -1 spowoduje włączenie nowego zachowania , które zostanie zaimplementowane w przyszłej wersji PHP, w której $ HTTP_RAW_POST_DATA nigdy nie zostanie zdefiniowane.


Zmiany do PHP-5.6

wielokrotnego użytku, optioanlly Jitty zainicjowany php: // wejściowego strumienia Zmień always_populate_raw_post_data ustawienia INI przyjąć trzy wartości zamiast dwóch.

-1: Zachowanie mistrza; Nigdy nie wypełniać $ GLOBALS [HTTP_RAW_POST_DATA]

0/off/cokolwiek: zachowanie BC (wypełnić jeśli Content-Type nie jest zarejestrowany lub metoda jest inna niż żądanie POST)

1/na/tak/prawda: zachowanie BC (zawsze wypełnić $ GLOBALS [HTTP_RAW_POST_DATA])

+0

Zmiana wartości na -1 powoduje usunięcie problemu. – Morgan

Powiązane problemy