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

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

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

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

Оказывается, мое понимание сообщения об ошибке было неправильным. Я бы сказал, что у него очень плохой выбор слов. 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, вы не только избегаете предупреждения, как сказано в сообщении, но и, наконец, отключает заполнение этой переменной, чего я хотел.

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

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

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

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

Подобно:

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

Если вы используете 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

и найдите значение файла Loaded Configuration File . В моем случае php.ini используемый WAMP, находится в:

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

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

Разоружение

 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 

Для тех, кто все еще борется с этой проблемой после изменения php.init, как предполагает принятый ответ. Поскольку ошибка возникает, когда петиция ajax производится через 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, }); 

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

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

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