Предупреждение о `$ HTTP_RAW_POST_DATA` устарело

Я переключился на PHP 5.6.0, и теперь везде получаю следующее предупреждение:

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

Хорошо, я полагаюсь на некоторые устаревшие функции. За исключением того, что я этого не делаю!

  • Я никогда не использовал эту переменную ни в одном из моих скриптов. Честно говоря, я даже не подозревал, что он существует.
  • phpinfo() показывает, что у меня always_populate_raw_post_data установлено значение 0 (отключено). Итак, что происходит?

Я не хочу "избегать предупреждения", установив это значение равным -1. Это просто скроет предупреждение, и у меня все еще будет устаревшая конфигурация. Я хочу решить проблему в ее источнике и знать, почему PHP считает, что включение HTTP_RAW_POST_DATA включено.

Ответ 1

Оказывается, мое понимание сообщения об ошибке было неправильным. Я бы сказал, что у него очень плохой выбор слов. Google googling показал мне, что кто-то еще неправильно понял сообщение точно так же, как я сделал - см. PHP-ошибка # 66763.

После совершенно бесполезного "Это то, как хотели это RM". ответ на эту ошибку Майка, Тайраэль объясняет, что установка этого параметра на "-1" не означает, что предупреждение просто исчезнет. Он поступает правильно, т.е. Полностью отключает заполнение переменной преступника. Оказывается, что при условии, что он установлен в 0 STILL, он заполняет данные при некоторых обстоятельствах. Расскажите о плохом дизайне! Чтобы привести PHP RFC:

Измените параметр always_populate_raw_post_data INI, чтобы принять три значения вместо двух.

  • -1: поведение мастера; никогда не заполняют $GLOBALS [HTTP_RAW_POST_DATA]
  • 0/off/whatever: поведение BC (заполняется, если тип контента не зарегистрирован, или метод запроса отличен от POST)
  • 1/on/yes/true: поведение BC (всегда заполнять $GLOBALS [HTTP_RAW_POST_DATA])

Итак, да, установив его на -1, вы не только избегаете предупреждения, как и сообщение, но оно также, наконец, отключает заполнение этой переменной, чего я хотел.

Ответ 2

Некоторое время, пока я не наткнулся на эту ошибку. Положите мой ответ всем, кто может наткнуться на этот вопрос.

Ошибка означает, что вы отправляете пустой запрос POST. Эта ошибка обычно встречается в HTTPRequests без переданных параметров. Чтобы избежать этой ошибки, вы всегда можете добавить параметр к POST без изменения php.ini.

Как

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

Ответ 3

Я столкнулся с той же проблемой на сервере nginx (DigitalOcean) - все, что мне нужно было сделать, это войти в систему как root и изменить файл /etc/php5/fpm/php.ini.

Чтобы найти строку с always_populate_raw_post_data, я сначала запускаю grep:

grep -n 'always_populate_raw_post_data' php.ini

Это вернуло строку 704

704:;always_populate_raw_post_data = -1

Затем просто откройте php.ini на этой строке с помощью редактора vi:

vi +704 php.ini

Удалите двоеточие, чтобы раскомментировать его и сохранить файл :wq

Наконец, перезагрузите сервер, и ошибка исчезла.

Ответ 4

Если вы используете WAMP...

вы должны добавить или раскомментировать свойство always_populate_raw_post_data в php.ini и установить его значение -1. В моем случае php.ini находится в:

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

, но если вы все еще получаете предупреждение (как и я)

Вы также должны установить always_populate_raw_post_data = -1 в phpForApache.ini:

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

Если вы не можете найти этот файл, откройте окно браузера и перейдите к:

http://localhost/?phpinfo=1

и найдите значение Загруженного файла конфигурации. В моем случае php.ini, используемый WAMP, находится в:

C:\wamp64\bin\apache\apache2.4.23\bin\php.ini (символическая ссылка на C:\wamp64\bin\php\php5.6.25\phpForApache.ini)

Наконец, перезапустите WAMP (или перезапустите все службы)

Ответ 5

Раскомментирование

always_populate_raw_post_data = -1 

в php.ini(строка # 703) и перезапуск служб APACHE помогают мне избавиться от сообщения в любом случае

; Always populate the $HTTP_RAW_POST_DATA variable. PHP 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

Ответ 6

Если файл .htaccess не доступен, создайте его в корневой папке и пропустите эту строку кода.

Поместите это в файл .htaccess (хорошо протестированный для API)

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>

Ответ 7

Для тех, кто все еще борется с этой проблемой после изменения php.init, как предполагает принятый ответ. Поскольку ошибка возникает, когда алиасовая петиция выполняется через POST без какого-либо параметра, все, что вам нужно сделать, это изменить метод отправки на GET.

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

Еще одна опция, если вы хотите сохранить метод POST по какой-либо причине, - это добавить пустой объект JSON в ajax petititon.

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

Ответ 8

Я получил это сообщение об ошибке при отправке данных из HTML-формы (метод Post). Все, что мне нужно было сделать, это изменить кодировку в форме с "text/plain" на "application/x-www-form-urlencoded" или "multipart/form-data". Сообщение об ошибке очень вводило в заблуждение.

Ответ 9

К сожалению, этот ответ @EatOng здесь не правильный. Прочитав его ответ, я добавил фиктивную переменную в каждый запрос AJAX, который я запускал (даже если у некоторых из них уже было несколько полей), чтобы быть уверенным, что ошибка никогда не появится.

Но только сейчас я столкнулся с той же чертовой ошибкой в PHP. Я дважды подтвердил, что отправил некоторые данные POST (некоторые другие поля тоже вместе с фиктивной переменной). Версия PHP 5.6.25, значение always_populate_raw_post_data равно 0.

Кроме того, когда я отправляю запрос application/json, PHP не json_decode() его до $_POST, скорее, мне нужно json_decode() - необработанное тело запроса POST, доступное через php://input.

В ответе @rr- цитирует,

0/выкл./Что угодно: поведение BC (заполняется, если тип содержимого не зарегистрирован или метод запроса отличается от POST).

Поскольку метод запроса точно POST, я предполагаю, что PHP не распознал/не понравился мой запрос Content-Type: application/json (опять же, почему??).

ОПЦИЯ 1:

Отредактируйте файл php.ini вручную и установите для переменной виновника значение -1, как предлагают многие ответы здесь.

ВАРИАНТ 2:

Это ошибка PHP 5.6. Обновите PHP.

ВАРИАНТ 3:

Как @user9541305 ответил здесь, изменение запроса Content-Type AJAX на application/x-www-form-urlencoded или multipart/form-data заставит PHP заполнить $_POST из тела POSTed (потому что PHP любит/распознает этот content-type заголовков !?).

ВАРИАНТ 4: ПОСЛЕДНИЙ КУРОРТ

Ну, я не хотел менять Content-Type AJAX, это вызвало бы много проблем при отладке. (Chrome DevTools прекрасно просматривает POST-переменные запросов JSON.)

Я разрабатываю эту вещь для клиента и не могу попросить их использовать последнюю версию PHP или редактировать файл php.ini. В крайнем случае, я просто проверю, установлено ли оно на 0 и если да, отредактирую файл php.ini в моем PHP-скрипте. Конечно, мне придется попросить пользователя перезагрузить Apache. Какой позор!

Вот пример кода:

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

Ответ 10

Что ж, если кто-то есть на общем хостинге и не имеет доступа к файлу php.ini, вы можете установить эту строку кода в самом верху ваших файлов PHP:

ini_set('always_populate_raw_post_data', -1);

Работает больше так же. Надеюсь, это сэкономит кому-то время на отладку :)

Ответ 11

; Always_populate_raw_post_data = -1 в php.init удалить комментарий этой строки.. always_populate_raw_post_data = -1