Advertencia acerca de que `$ HTTP_RAW_POST_DATA` está en desuso

121

Cambié a PHP 5.6.0 y ahora aparece la siguiente advertencia en todas partes:

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

Bien, confío en alguna característica obsoleta. ¡Excepto que yo no!

  1. Nunca he usado esta variable en ninguno de mis scripts. Para ser honesto, no tenía idea de que existe.
  2. phpinfo()muestra que he always_populate_raw_post_dataestablecido en 0 (deshabilitado). ¿Entonces qué está pasando?

No quiero "evitar la advertencia" estableciendo este valor en -1. Esto solo ocultará la advertencia y aún tendré una configuración obsoleta. Quiero resolver el problema en su origen y saber por qué PHP piensa que el HTTP_RAW_POST_DATAllenado está activado.

rr-
fuente
El mismo problema, pero posible causa / solución diferente: stackoverflow.com/questions/25984623/…
rr-
Esta advertencia me da problemas al ejecutar el controlador PHP SoapServer () en PHP> = 5.6. Esta advertencia siempre será superada en la respuesta de SOAP, de modo que el __soapCall () de SoapClient obtendrá la "excepción SoapFault: [Cliente] parece que no tenemos ningún documento XML". Tan difícil de depurar porque esta advertencia normalmente no aparecerá.
Johnny Wong

Respuestas:

135

Resulta que mi comprensión del mensaje de error fue incorrecta. Yo diría que presenta una elección de palabras muy pobre. Buscar en Google me mostró que alguien más entendió mal el mensaje exactamente como lo hice yo; vea el error PHP # 66763 .

Después de ser totalmente inútil "Así es como los RM querían que fuera". En respuesta a ese error de Mike, Tyrael explica que establecerlo en "-1" no solo hace que la advertencia desaparezca. Hace lo correcto , es decir, deshabilita por completo el llenado de la variable culpable. Resulta que tenerlo configurado en 0 STILL llena datos en algunas circunstancias. ¡Habla sobre el mal diseño! Para citar PHP RFC :

Cambie la configuración INI always_populate_raw_post_data para aceptar tres valores en lugar de dos.

  • -1: El comportamiento del maestro; nunca llene $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / apagado / lo que sea: comportamiento de BC (se completa si el tipo de contenido no está registrado o si el método de solicitud es diferente a POST)
  • 1 / on / yes / true: comportamiento de BC (siempre rellena $ GLOBALS [HTTP_RAW_POST_DATA])

Entonces, sí, establecerlo en -1 no solo evita la advertencia, como dice el mensaje, sino que finalmente deshabilita el llenado de esta variable, que es lo que quería.

rr-
fuente
23
tl; dr esta es una advertencia tonta que aparece incluso si no usas la cosa contra la que advierte; set always_populate_raw_post_data a -1
srcspider
77
Lo he configurado always_populate_raw_post_data = -1. todavía ahora viene la advertencia y corrompe la respuesta de json
itsazzad
2
Entonces, la respuesta en efecto es ir a su php.iniarchivo y establecer (o descomentar) always_populate_raw_post_data = -1.
John
Pero realmente no entiendo el punto. ¿Eso es exactamente lo que dice la advertencia? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas
@Andreas, el punto es la razón por la que dice eso, es decir, la diferencia entre 0, que aparentemente está "deshabilitado", y -1, que es ... "deshabilitado más fuerte". → confusión → razón de esta pregunta (y respuesta).
rr-
39

Ha pasado un tiempo hasta que me encontré con este error. Presente mi respuesta para cualquiera que pueda tropezar con este problema.

El error solo significa que está enviando una solicitud POST vacía. Este error se encuentra comúnmente en HTTPRequests sin pasar parámetros. Para evitar este error, siempre puede agregar un parámetro a la POST sin cambiar el php.ini.

Me gusta:

$.post(URL_HERE
    ,{addedvar : 'anycontent'}
    ,function(d){
       doAnyHere(d);
    }
    ,'json' //or 'html','text'
);
Comer ong
fuente
44
¡Esta es la mejor respuesta que he encontrado para este problema! He estado lidiando con este problema de vez en cuando durante un mes y me hizo mirar en la dirección equivocada. Simplemente tuve una POST vacía por accidente y una vez que se solucionó, ¡todo funcionó muy bien! ¡Gracias por salvarme de un terrible dolor de cabeza!
Craig Howell
34

Experimenté el mismo problema en el servidor nginx (DigitalOcean): todo lo que tuve que hacer es iniciar sesión como rooty modificar el archivo /etc/php5/fpm/php.ini.

Para encontrar la línea con la always_populate_raw_post_dataprimera vez que corro grep:

grep -n 'always_populate_raw_post_data' php.ini

Eso devolvió la línea 704

704:;always_populate_raw_post_data = -1

Luego simplemente abra php.inien esa línea con el vieditor:

vi +704 php.ini

Elimine el punto y coma para descomentarlo y guarde el archivo :wq

Por último, reinicie el servidor y el error desapareció.

Sebastian Sulinski
fuente
3
Si la línea está comentada en su php.ini, probablemente esté utilizando una configuración de desarrollo de php.ini.
BadHorsie
13

Si está utilizando WAMP ...

se debe añadir o eliminar el comentario de la propiedad always_populate_raw_post_dataen php.iniy establezca su valor a -1. En mi caso php.inise encuentra en:

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

... pero si todavía recibes la advertencia (como yo)

También debe establecer always_populate_raw_post_data = -1en phpForApache.ini:

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

Si no puede encontrar este archivo, abra una ventana del navegador y vaya a:

http://localhost/?phpinfo=1

y busque el valor de la clave del archivo de configuración cargado . En mi caso, el php.iniutilizado por WAMP se encuentra en:

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

Finalmente reinicie WAMP (o haga clic en reiniciar todos los servicios)

Ricardo Tribaldos
fuente
6

Si el .htaccess archivo no está disponible, créelo en la carpeta raíz y pase esta línea de código.

Ponga esto en el .htaccessarchivo (probado funcionando bien para API)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
Shaan Ansari
fuente
2
por favor explique Mi Señor
Zohaib
5

Descomentando el

always_populate_raw_post_data = -1 

en php.ini (línea # 703) y reiniciar los servicios APACHE me ayudan a deshacerme del mensaje de todos modos

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

Para cualquiera que todavía tenga problemas con este problema después de cambiar el php.init como sugiere la respuesta aceptada. Dado que el error ocurre cuando se realiza una petición ajax POSTsin ningún parámetro, todo lo que tiene que hacer es cambiar el método de envío a GET.

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

Aún otra opción si desea mantener el método POSTpor cualquier motivo es agregar un objeto JSON vacío al petititon ajax.

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

Recibí este mensaje de error al enviar datos desde un formulario html (método Post). Todo lo que tenía que hacer era cambiar la codificación en el formulario de "text / plain" a "application / x-www-form-urlencoded" o "multipart / form-data". El mensaje de error fue muy engañoso.

usuario9541305
fuente
2

Desafortunadamente, esta respuesta aquí por @EatOng no es correcta . Después de leer su respuesta, agregué una variable ficticia a cada solicitud AJAX que estaba disparando (incluso si algunos de ellos ya tenían algunos campos) solo para asegurarme de que el error nunca aparece.

Pero justo ahora me encontré con el mismo maldito error de PHP. Confirmé dos veces que había enviado algunos datos POST (algunos otros campos también junto con la variable ficticia). Versión de PHP 5.6.25, el always_populate_raw_post_datavalor se establece en0 .

Además, como estoy enviando una application/jsonsolicitud, PHP no la está completando $_POST, sino que tengo que json_decode()ingresar al cuerpo de la solicitud POST sin procesar, accesible por php://input.

Como la respuesta de @ rr- cita,

0 / apagado / lo que sea: comportamiento de BC (se completa si el tipo de contenido no está registrado o si el método de solicitud es diferente a POST ).

Debido a que el método de solicitud es POST seguro, supongo que PHP no reconoció / me gustó mi Content-Type: application/jsonsolicitud (de nuevo, ¿por qué?).

OPCIÓN 1:

Edite el php.iniarchivo manualmente y establezca la variable culpable en -1, como sugieren muchas de las respuestas aquí.

OPCION 2:

Este es un error de PHP 5.6. Actualiza PHP.

OPCION 3:

Como @ user9541305 respondió aquí, cambiar la Content-Typesolicitud de AJAX application/x-www-form-urlencodedo multipart/form-datahará que PHP $_POSTcomplete el mensaje desde el cuerpo POSTed (¡porque PHP le gusta / reconoce esos content-typeencabezados !?).

OPCIÓN 4: ÚLTIMO RECURSO

Bueno, no quería cambiar el Content-Typede AJAX, causaría muchos problemas para la depuración. (Chrome DevTools visualiza muy bien las variables POST de solicitudes JSON).

Estoy desarrollando esto para un cliente y no puedo pedirles que usen PHP más reciente ni que editen el archivo php.ini. Como último recurso, solo comprobaré si está configurado 0y, de ser así, editaré el php.iniarchivo en mi script PHP. Por supuesto, tendré que pedirle al usuario que reinicie Apache. ¡Qué lástima!

Aquí hay un código de muestra:

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

Bueno, si hay alguien en un hosting compartido y sin acceso al php.iniarchivo, puede configurar esta línea de código en la parte superior de sus archivos PHP:

ini_set('always_populate_raw_post_data', -1);

Funciona más de lo mismo. Espero que le ahorre a alguien algo de tiempo de depuración :)

Martins
fuente
0

NB: SI USTED ESTÁ USANDO PHPSTORM ingrese la descripción de la imagen aquí


Pasé una hora tratando de resolver este problema, pensando que era mi problema con el servidor php, así que configuré 'always_populate_raw_post_data' en '-1' en php.ini y nada funcionó.

Hasta que descubrí que el uso del servidor integrado phpStorm es lo que causa el problema como se detalla en la respuesta aquí: Respuesta de LazyOne Aquí , así que pensé en compartirlo.

KADEM Mohammed
fuente
-1

; always_populate_raw_post_data = -1 en php.init eliminar el comentario de esta línea .. always_populate_raw_post_data = -1

Tejaswi Tandel
fuente
44
¿¿Podrías explicar?? por qué ? Además, formatee / sangra su publicación correctamente.
Ravi
-1

Acabo de recibir la solución a este problema de un amigo. él dijo: Agregar ob_start (); bajo su código de sesión. Puede agregar exit (); debajo del encabezado Lo intenté y funcionó. Espero que esto ayude

Esto es para aquellos en un servidor de alojamiento alquilado que no tienen acceso al archivo php.init.

kjava
fuente