Aviso sobre a exclusão de `$ HTTP_RAW_POST_DATA`

121

Eu mudei para o PHP 5.6.0 e agora recebo o seguinte aviso em todos os lugares:

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

Tudo bem, eu confio em algum recurso obsoleto. Exceto que eu não!

  1. Eu nunca usei essa variável em nenhum dos meus scripts. Para ser sincero, eu não fazia ideia de que ele existe.
  2. phpinfo()mostra que eu always_populate_raw_post_dataconfigurei para 0 (desativado). Então, o que está acontecendo?

Não quero "evitar o aviso" definindo esse valor como -1. Isso apenas ocultará o aviso e ainda terei a configuração descontinuada. Quero resolver o problema na sua origem e saber por que o PHP acha que o HTTP_RAW_POST_DATApreenchimento está ativado.

rr-
fonte
O mesmo problema, mas possível causa / solução diferente: stackoverflow.com/questions/25984623/…
rr-
Este aviso me causa problemas ao executar o handle do PHP SoapServer () no PHP> = 5.6. Esse aviso sempre será emitido na resposta do SOAP, para que o __soapCall () de um SoapClient obtenha a "exceção SoapFault: [Client] parece que não temos documento XML". Tão difícil de depurar, porque esse aviso normalmente não aparece.
Johnny Wong

Respostas:

135

Acontece que meu entendimento da mensagem de erro estava errado. Eu diria que apresenta uma escolha muito pobre de palavras. Pesquisando por aí me mostrou que alguém entendeu mal a mensagem exatamente como eu - veja o bug no PHP # 66763 .

Depois de totalmente inútil "Era assim que os RMs queriam que fosse". resposta a esse bug por Mike, Tyrael explica que defini-lo como "-1" não faz apenas o aviso para desaparecer. Ele faz a coisa certa , ou seja, desativa completamente o preenchimento da variável culpada. Acontece que defini-lo como 0 AINDA preenche os dados sob algumas circunstâncias. Fale sobre design ruim! Para citar o PHP RFC :

Altere a configuração INI always_populate_raw_post_data para aceitar três valores em vez de dois.

  • -1: O comportamento do mestre; nunca preencha $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / desativado / qualquer que seja: comportamento do BC (preencha se o tipo de conteúdo não estiver registrado ou o método de solicitação for diferente de POST)
  • 1 / on / yes / true: comportamento do BC (sempre preencha $ GLOBALS [HTTP_RAW_POST_DATA])

Então, defini-lo como -1 não apenas evita o aviso, como a mensagem dizia, mas também desabilita o preenchimento dessa variável, que é o que eu queria.

rr-
fonte
23
tl; dr, este é um aviso idiota que aparece mesmo que você não use o que ele adverte; defina always_populate_raw_post_data como -1
srcspider 27/04
7
Eu o configurei always_populate_raw_post_data = -1. Ainda agora o aviso chegando e corrompendo a resposta JSON
itsazzad
2
Portanto, a resposta em vigor é ir ao seu php.iniarquivo e definir (ou descomentar) always_populate_raw_post_data = -1.
John John
Mas não entendi direito. É exatamente isso que o aviso está dizendo? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas
@Andreas o ponto é a razão pela qual diz que, ou seja, a diferença entre 0, que é aparentemente "desativado", e -1, que é ... "desativado mais forte"? → confusão → razão para esta pergunta (e resposta).
precisa
39

Já faz um tempo até que me deparei com esse erro. Coloque minha resposta para qualquer um que tropeçar nessa questão.

O erro significa apenas que você está enviando uma solicitação POST vazia. Esse erro geralmente é encontrado em HTTPRequests sem parâmetros passados. Para evitar esse erro, você sempre pode adicionar um parâmetro ao POST sem alterar o php.ini.

Gostar:

$.post(URL_HERE
    ,{addedvar : 'anycontent'}
    ,function(d){
       doAnyHere(d);
    }
    ,'json' //or 'html','text'
);
Eat Ong
fonte
4
Essa é a melhor resposta que encontrei para esse problema! Estou lidando com esse problema de vez em quando há um mês e isso me levou a olhar na direção errada. Eu simplesmente tive um POST vazio por acidente e uma vez que foi consertado tudo funcionou muito bem! Obrigado por me salvar de uma terrível dor de cabeça!
Craig Howell
34

Tive o mesmo problema no servidor nginx (DigitalOcean) - tudo o que eu precisava fazer era fazer login como roote modificar o arquivo /etc/php5/fpm/php.ini.

Para encontrar a linha com a always_populate_raw_post_dataprimeira execução grep:

grep -n 'always_populate_raw_post_data' php.ini

Que retornou a linha 704

704:;always_populate_raw_post_data = -1

Em seguida, basta abrir php.ininessa linha com o vieditor:

vi +704 php.ini

Remova o ponto e vírgula para remover o comentário e salvar o arquivo :wq

Por fim, reinicie o servidor e o erro desapareceu.

Sebastian Sulinski
fonte
3
Se a linha for comentada no seu, php.iniprovavelmente você está usando uma configuração de desenvolvimento do php.ini.
precisa saber é o seguinte
13

Se você estiver usando o WAMP ...

você deve adicionar ou remover o comentário da propriedade always_populate_raw_post_dataem php.inie defina seu valor como -1. No meu caso, php.iniestá localizado em:

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

..mas se você ainda estiver recebendo o aviso (como eu estava)

Você também deve definir always_populate_raw_post_data = -1em phpForApache.ini:

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

Se você não encontrar este arquivo, abra uma janela do navegador e vá para:

http://localhost/?phpinfo=1

e procure o valor da chave do arquivo de configuração carregado . No meu caso, o php.iniusado pelo WAMP está localizado em:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (link simbólico para C: \ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini)

Finalmente, reinicie o WAMP (ou clique em reiniciar todos os serviços)

Ricardo Tribaldos
fonte
6

Se o .htaccessarquivo não estiver disponível, crie-o na pasta raiz e passe esta linha de código.

Coloque isso no .htaccessarquivo (testado funcionando bem para API)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
Shaan Ansari
fonte
2
por favor explique My Lord
Zohaib
5

Descomentando o

always_populate_raw_post_data = -1 

no php.ini (linha 703) e reiniciar os serviços do APACHE me ajudam a me livrar da mensagem de qualquer maneira

; 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
fonte
4

Para quem ainda está lutando com esse problema depois de alterar o php.init, como sugere a resposta aceita. Como o erro ocorre quando uma petição ajax é feita POSTsem nenhum parâmetro, tudo o que você precisa fazer é alterar o método send para GET.

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

Ainda uma outra opção, se você deseja manter o método POSTpor qualquer motivo, é adicionar um objeto JSON vazio ao petititon ajax.

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

Recebi essa mensagem de erro ao enviar dados de um formulário html (método Post). Tudo o que eu precisava fazer era alterar a codificação no formulário de "texto / sem formatação" para "application / x-www-form-urlencoded" ou "multipart / form-data". A mensagem de erro foi muito enganosa.

user9541305
fonte
2

Infelizmente, esta resposta aqui de @EatOng não está correta . Depois de ler sua resposta, adicionei uma variável fictícia a cada solicitação AJAX que eu estava disparando (mesmo que algumas delas já tivessem alguns campos) apenas para garantir que o erro nunca apareça.

Mas agora eu me deparei com o mesmo erro do PHP. Confirmei duas vezes que havia enviado alguns dados POST (alguns outros campos também junto com a variável dummy). Versão do PHP 5.6.25, o always_populate_raw_post_datavalor está definido como 0.

Além disso, como estou enviando uma application/jsonsolicitação, o PHP não a preenche $_POST, e sim ao json_decode()corpo da solicitação POST bruta, acessível por php://input.

Como a resposta de @rites,

0 / desativado / qualquer que seja: comportamento do BC (preencha se o tipo de conteúdo não estiver registrado ou o método de solicitação for diferente de POST ).

Como o método request é certamente o POST, acho que o PHP não reconheceu / gostou do meu Content-Type: application/jsonpedido (novamente, por quê?).

OPÇÃO 1:

Edite o php.iniarquivo manualmente e defina a variável culpada -1como, como sugerem muitas das respostas aqui.

OPÇÃO 2:

Este é um bug do PHP 5.6. Atualize o PHP.

OPÇÃO 3:

Como o @ user9541305 respondeu aqui, alterar a Content-Typesolicitação AJAX para application/x-www-form-urlencodedou multipart/form-datafará com que o PHP preencha o $_POSTcorpo do POSTed (porque o PHP gosta / reconhece esses content-typecabeçalhos !?).

OPÇÃO 4: ÚLTIMO RECURSO

Bem, eu não queria mudar o Content-TypeAJAX, isso causaria muitos problemas para depuração. (O Chrome DevTools exibe bem as variáveis ​​POSTed das solicitações JSON.)

Estou desenvolvendo isso para um cliente e não posso pedir que ele use o PHP mais recente nem edite o arquivo php.ini. Como último recurso, apenas verificarei se está definido 0e, em caso afirmativo, edite o php.iniarquivo no meu próprio script PHP. Claro que terei que pedir ao usuário para reiniciar o apache. Que pena!

Aqui está um código de exemplo:

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

Bem, se houver alguém por aí em uma hospedagem compartilhada e sem acesso ao php.iniarquivo, você pode definir esta linha de código no topo dos seus arquivos PHP:

ini_set('always_populate_raw_post_data', -1);

Funciona mais do mesmo. Espero que poupa a alguém algum tempo de depuração :)

Martins
fonte
0

NB: SE VOCÊ ESTÁ USANDO PHPSTORM insira a descrição da imagem aqui


Passei uma hora tentando resolver esse problema, pensando que era o meu problema no servidor php. Então, configurei 'always_populate_raw_post_data' para '-1' no php.ini e nada funcionou.

Até que eu descobri que o uso do servidor phpStorm embutido é o que está causando o problema, conforme detalhado na resposta aqui: Resposta por LazyOne Aqui , pensei em compartilhá-lo.

KADEM Mohammed
fonte
-1

; always_populate_raw_post_data = -1 no php.init remove o comentário desta linha .. always_populate_raw_post_data = -1

Tejaswi Tandel
fonte
4
você poderia explicar? porque ? Além disso, formate / indente sua postagem corretamente.
Ravi
-1

Acabei de receber a solução para este problema de um amigo. ele disse: Adicione ob_start (); sob o código da sua sessão. Você pode adicionar exit (); sob o cabeçalho. Eu tentei e funcionou. Espero que isto ajude

Isto é para aqueles em um servidor de hospedagem alugado que não tem acesso ao arquivo php.init.

kjava
fonte