Почему вызывается $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])