Почему вызывается $HTTP_RAW_POST_DATA?
Недавно я обновил свой производственный сервер до Ubuntu 14.04 и PHP 5.6, и теперь я получаю предупреждения в своем журнале ошибок:
2014/10/31 10:42:45 [error] 17128#0: *46238 FastCGI sent in stderr: "PHP message: PHP 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" while reading response header from upstream, client: 24.123.216.42, server: example.com, request: "POST /api/notes HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "example.com", referrer: "https://example.com/admin/"
I прочитать документацию, а также этот несколько актуальный вопрос: Undefined variable: HTTP_RAW_POST_DATA. Однако я не могу понять, почему это уведомление записывается. Насколько я могу судить, я не использую $HTTP_RAW_POST_DATA
где-либо в моей кодовой базе. Я пробовал:
find . -exec grep "HTTP_RAW_POST_DATA" {} \; -print 2>/dev/null
из корневого каталога моего проекта (включая все каталоги поставщиков), но я не нахожу совпадений.
I читайте больше о always_populate_raw_post_data
и кажется, что $HTTP_RAW_POST_DATA
следует заполнять, только если параметр always_populate_raw_post_data
установлен на ПРАВДА. Я проверил свой phpinfo()
, а параметр установлен на 0.
Если я явно не вызываю $HTTP_RAW_POST_DATA
и always_populate_raw_post_data
установлен в 0
, почему я получаю эти уведомления в своем журнале ошибок? Что делает установка always_populate_raw_post_data
в -1
?
Ответы
Ответ 1
Здесь соответствующий код C с моими комментариями:
static zend_bool populate_raw_post_data(TSRMLS_D)
{
// not a post, empty request - return FALSE
if (!SG(request_info).request_body) {
return (zend_bool) 0;
}
// if always_populate_raw_post_data=0 then
// if we don't know how to parse the post (unknown mimetype) return TRUE
// otherwise (known mimetype) return FALSE
if (!PG(always_populate_raw_post_data)) {
return (zend_bool) !SG(request_info).post_entry;
}
// if always_populate_raw_post_data > 0 return TRUE
// if always_populate_raw_post_data < 0 return FALSE
return (zend_bool) (PG(always_populate_raw_post_data) > 0);
}
То есть установка always_populate_raw_post_data
в 0
по-прежнему позволяет заполнять неизвестные типы содержимого. Вы должны использовать отрицательное значение, чтобы пропустить его вообще.
Теперь это документально в руководстве:
Предпочтительным методом доступа к исходным данным POST является вход php://, а $HTTP_RAW_POST_DATA устарел в PHP 5.6.0 и далее. Установка always_populate_raw_post_data в -1 будет определять новое поведение, которое будет реализовано в будущей версии PHP, в которой $HTTP_RAW_POST_DATA никогда не определяется.
Ответ 2
Он уже был зарегистрирован как отчет
Также читайте this.
В основном измените значение на -1
, и это устранит вашу "проблему".
Также убедитесь, что вы используете php://input
ниже, ниже V
Думаю, было бы лучше описать, что на самом деле происходит: E_DEPRECATED будет сгенерирован при заполнении $HTTP_RAW_POST_DATA который контролируется значением always_populate_raw_post_data (ссылка на http://php.net/manual/en/ini.core.php, где мы уже описываем в в этом случае будет заполнено значение $HTTP_RAW_POST_DATA) и удалить устаревшее сообщение убедитесь, что вы не используете $HTTP_RAW_POST_DATA но php://input, то вы можете отключить $HTTP_RAW_POST_DATA с помощью параметра always_populate_raw_post_data для -1, который удалит E_DEPRECATED.
из http://php.net/manual/en/ini.core.php:
Если установлено значение TRUE, PHP всегда будет заполнять $HTTP_RAW_POST_DATA содержащие необработанные данные POST. В противном случае переменная заполняется только когда тип данных MIME не распознается.
Предпочтительным способом доступа к необработанным данным POST является вход php://и $HTTP_RAW_POST_DATA устарел в PHP 5.6.0 и далее. настройка always_populate_raw_post_data -1 будет выбирать новое поведение которые будут реализованы в будущей версии PHP, в которой $HTTP_RAW_POST_DATA никогда не определяется.
Изменения в PHP-5.6
Повторно использовать, optioanlly JITty инициализированный php://входной поток Change 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])