Предупреждение о `$ 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