web-dev-qa-db-fra.com

Avertissement concernant `$ HTTP_RAW_POST_DATA` étant obsolète

Je suis passé à PHP 5.6.0 et je reçois maintenant l'avertissement suivant partout:

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, je compte sur certaines fonctionnalités obsolètes. Sauf que moi non!

  1. Je n'ai jamais utilisé cette variable dans aucun de mes scripts. Pour être honnête, je ne savais même pas que ça existait.
  2. phpinfo() indique que always_populate_raw_post_data est réglé sur 0 (désactivé). Alors, quoi de neuf?

Je ne veux pas "éviter l'avertissement" en mettant cette valeur à -1. Cela ne fera que masquer l'avertissement, et j'aurai toujours une configuration obsolète. Je veux résoudre le problème à sa source et savoir pourquoi PHP pense que HTTP_RAW_POST_DATA le peuplement est activé.

116
rr-

Il s’avère que ma compréhension du message d’erreur était erronée. Je dirais qu'il comporte un très mauvais choix de mots. Googler m'a montré que quelqu'un d'autre avait mal compris le message exactement comme je l'avais fait - voir bogue PHP # 6676 .

Après totalement inutile "C'est ce que les MR voulaient." En réponse à ce bogue de Mike, Tyrael explique que le régler sur "-1" ne signifie pas seulement que l'avertissement disparaît. Il fait le bonne chose, c’est-à-dire qu’il désactive complètement le remplissage de la variable coupable. Il s'avère que le fait de le mettre à 0 TOUJOURS remplit les données dans certaines circonstances. Parlez de mauvais design! Pour citer PHP RFC :

Modifiez le paramètre always_populate_raw_post_data INI pour qu'il accepte trois valeurs au lieu de deux.

  • -1: le comportement du maître; ne jamais renseigner $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0/off/any: comportement du BC (à remplir si le type de contenu n'est pas enregistré ou si la méthode de requête est différente de POST)
  • 1/on/yes/true: comportement de BC (remplissez toujours $ GLOBALS [HTTP_RAW_POST_DATA])

Donc oui, le mettre à -1 évite non seulement l'avertissement, comme le message le dit, mais aussi finit par désactiver remplir cette variable, ce que je voulais.

130
rr-

Ça fait longtemps que je suis tombé sur cette erreur. Posez ma réponse à quiconque pourrait trébucher sur cette question.

L'erreur signifie uniquement que vous envoyez une demande POST vide. Cette erreur est généralement rencontrée sur HTTPRequests sans qu'aucun paramètre ne soit transmis. Pour éviter cette erreur, vous pouvez toujours ajouter un paramètre au POST sans changer le php.ini.

Comme:

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

J'ai rencontré le même problème sur le serveur nginx (DigitalOcean). Tout ce que j'avais à faire, c'était de vous connecter en tant que root et de modifier le fichier /etc/php5/fpm/php.ini.

Pour trouver la ligne avec le always_populate_raw_post_data je lance d'abord grep:

grep -n 'always_populate_raw_post_data' php.ini

Cela a retourné la ligne 704

704:;always_populate_raw_post_data = -1

Ensuite, ouvrez simplement php.ini sur cette ligne avec vi editor:

vi +704 php.ini

Supprimez le point-virgule pour le supprimer et enregistrez le fichier :wq

Enfin, redémarrez le serveur et l'erreur a disparu.

32
Sebastian Sulinski

Si vous utilisez WAMP ...

vous devez ajouter ou supprimer le commentaire de la propriété _always_populate_raw_post_data_ dans _php.ini_ et lui attribuer la valeur _-1_. Dans mon cas, _php.ini_ est situé à:

_C:\wamp64\bin\php\php5.6.25\php.ini_

.. mais si vous recevez toujours l'avertissement (comme j'étais)

Vous devez également définir _always_populate_raw_post_data = -1_ dans phpForApache.ini:

_C:\wamp64\bin\php\php5.6.25\phpForApache.ini_

Si vous ne trouvez pas ce fichier, ouvrez une fenêtre de navigateur et accédez à:

_http://localhost/?phpinfo=1_

et recherchez la valeur de Loaded Configuration File key. Dans mon cas, le _php.ini_ utilisé par WAMP est situé à:

_C:\wamp64\bin\Apache\apache2.4.23\bin\php.ini_ (lien symbolique vers C:\wamp64\bin\php\php5.6.25\phpForApache.ini)

Enfin, redémarrez WAMP (ou cliquez sur Redémarrer tous les services)

12
Ricardo Tribaldos

Décommenter le

always_populate_raw_post_data = -1 

dans php.ini (ligne # 703) et le redémarrage des services Apache m'aident à me débarrasser du message quand même

; 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
5
Nava Bogatee

Si le fichier .htaccess n'est pas disponible, créez-le dans le dossier racine et au-delà de cette ligne de code.

Mettez ceci dans le fichier .htaccess (teste bien pour l'API)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
5
Shaan Ansari

Pour tous ceux qui sont encore aux prises avec ce problème après avoir modifié le fichier php.init, comme le suggère la réponse acceptée. Puisque l'erreur se produit lorsqu'une requête ajax est faite via POST sans aucun paramètre, il vous suffit de changer la méthode d'envoi en GET.

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

Encore une autre option si vous souhaitez conserver la méthode POST pour quelque raison que ce soit consiste à ajouter un objet JSON vide à ajax petititon.

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

J'ai reçu ce message d'erreur lors de l'envoi de données à partir d'un formulaire HTML (méthode Post). Tout ce que je devais faire était de changer le codage sous la forme de "text/plain" à "application/x-www-form-urlencoded" ou "multipart/form-data". Le message d'erreur était très trompeur.

3
user9541305

Eh bien, s'il y a quelqu'un sur un hébergement partagé et sans accès au fichier php.ini, vous pouvez définir cette ligne de code tout en haut de vos fichiers PHP:

ini_set('always_populate_raw_post_data', -1);

Fonctionne plus du même. J'espère que cela économisera du temps de débogage à quelqu'un :)

0
Martins

Malheureusement, cette réponse ici par @EatOng est inexact. Après avoir lu sa réponse, j’ai ajouté une variable factice à chaque AJAX requête que j’étais en train de renvoyer (même si certains d’entre eux avaient déjà des champs) pour que l’erreur ne s’apparaisse jamais.

Mais tout à l'heure, je suis tombé sur la même erreur de PHP. J'ai confirmé deux fois que j'avais envoyé des données POST (d'autres champs également avec la variable factice). PHP version 5.6.25, always_populate_raw_post_data la valeur est définie sur 0.

De plus, comme j'envoie une demande application/json, PHP ne le renseigne pas sur $_POST, je dois plutôt json_decode() le raw POST corps de la demande, accessible par php://input.

Comme la réponse de @ rr- cites,

0/off/any: comportement du BC (remplir si le type de contenu n'est pas enregistré ou la méthode de requête est autre que POST).

Comme la méthode de requête est certainement POST, j'imagine que PHP n'a pas reconnu/n'a pas apprécié/aimé ma demande Content-Type: application/json (encore une fois, pourquoi ??).

OPTION 1:

Editez le fichier php.ini manuellement et réglez la variable coupable sur -1, comme le suggèrent de nombreuses réponses.

OPTION 2:

Ceci est un bogue PHP 5.6. Mettre à niveau PHP.

OPTION 3:

Comme @ user9541305 a répondu ici, changer la demande Content-Type de AJAX en application/x-www-form-urlencoded ou multipart/form-data fera que PHP remplira le $_POST depuis le corps POSTed (parce que PHP aime/reconnaît ces en-têtes content-type !?).

OPTION 4: DERNIER RECOURS

Eh bien, je ne voulais pas changer le Content-Type d'AJAX, cela causerait beaucoup de problèmes pour le débogage. (Chrome DevTools visualise les variables POSTed des requêtes JSON.)

Je développe cette chose pour un client et je ne peux pas leur demander d’utiliser le dernier PHP, ni d’éditer le fichier php.ini. En dernier recours, je vérifierai simplement s'il est réglé sur 0 et si c'est le cas, modifiez le fichier php.ini dans mon script PHP. Bien sûr, je devrai demander à l'utilisateur de redémarrer Apache. C'est dommage!

Voici un exemple de code:

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