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

121

Я перешел на 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

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

  1. Я никогда не использовал эту переменную ни в одном из своих скриптов. Если честно, я понятия не имел, что он вообще существует.
  2. phpinfo()показывает, что я always_populate_raw_post_dataустановил значение 0 (отключено). Так, что происходит?

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

rr-
источник
Та же проблема, но возможны другие причины / решения: stackoverflow.com/questions/25984623/…
rr-
Это предупреждение вызывает у меня проблемы при запуске PHP SoapServer handle () на PHP> = 5.6. Это предупреждение всегда будет выводиться в ответе SOAP, так что SoapClient __soapCall () получит исключение «SoapFault exception: [Client] похоже, что у нас нет XML-документа». Так сложно отлаживать, потому что это предупреждение обычно не появляется.
Джонни Вонг

Ответы:

135

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

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

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

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

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

rr-
источник
23
tl; dr это глупое предупреждение, которое появляется, даже если вы не используете то, против чего оно предупреждает; установите always_populate_raw_post_data в -1
srcspider
7
я установил это always_populate_raw_post_data = -1. по-прежнему появляется предупреждение и
портит
2
Таким образом, в действительности ответ - перейти к вашему php.iniфайлу и установить (или раскомментировать) always_populate_raw_post_data = -1.
Джон
Но я не совсем понимаю. Это именно то, о чем говорится в предупреждении? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Андреас
@Andreas, дело в том, почему он говорит это, то есть разница между 0, который, по-видимому, "отключен", и -1, который ... "сильнее отключен"? → путаница → причина этого вопроса (и ответ).
рр-
39

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

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

Подобно:

$.post(URL_HERE
    ,{addedvar : 'anycontent'}
    ,function(d){
       doAnyHere(d);
    }
    ,'json' //or 'html','text'
);
Есть онг
источник
4
Это лучший ответ на этот вопрос, который я нашел! Я занимался этой проблемой время от времени в течение месяца, и это заставило меня смотреть не в том направлении. У меня просто случайно был пустой POST, и как только это было исправлено, все отлично заработало! Спасибо, что избавили меня от страшной головной боли!
Крейг Хауэлл
34

У меня возникла такая же проблема на сервере 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

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

Себастьян Сулински
источник
3
Если строка закомментирована в вашем, php.iniвы, вероятно, используете конфигурацию разработки php.ini.
BadHorsie 01
13

Если вы используете 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 (или нажмите перезапустить все службы)

Рикардо Трибальдос
источник
6

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

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

<IfModule mod_php5.c>
    php_value always_populate_raw_post_data -1
</IfModule>
Шаан Ансари
источник
2
пожалуйста, объясните,
Милорд
5

Раскомментируя

always_populate_raw_post_data = -1 

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

; 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
Нава Богати
источник
4

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

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

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

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

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

user9541305
источник
3

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

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

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

Как ответил @ rr-cites,

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-TypeAJAX, это вызвало бы много проблем при отладке. (Chrome DevTools прекрасно просматривает переменные POSTed запросов 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;
}
Джей Дадхания
источник
0

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

ini_set('always_populate_raw_post_data', -1);

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

Martins
источник
0

NB: ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ PHPSTORM введите описание изображения здесь


Я потратил час, пытаясь решить эту проблему, думая, что это проблема моего php-сервера, поэтому я установил 'always_populate_raw_post_data' в '-1' в php.ini, и ничего не сработало.

Пока я не узнал, что использование встроенного сервера phpStorm является причиной проблемы, как подробно описано в ответе здесь: Ответ от LazyOne Здесь , поэтому я подумал о том, чтобы поделиться им.

КАДЕМ Мохаммед
источник
-1

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

Теджасви Тандель
источник
4
могли бы вы объяснить?? Зачем ? Кроме того, правильно отформатируйте / сделайте отступ для вашего сообщения.
Рави
-1

Я только что получил от друга решение этой проблемы. он сказал: добавьте ob_start (); под кодом вашей сессии. Вы можете добавить exit (); под шапкой. Я попробовал, и это сработало. Надеюсь это поможет

Это для тех, кто находится на арендованном сервере хостинга и не имеет доступа к файлу php.init.

Клява
источник