Попередження про припинення `$ 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заселення включено.


Та ж проблема, але можливо різні причини / Рішення: stackoverflow.com/questions/25984623 / ...
rr-

Це попередження створює мені проблеми під час запуску ручки PHP SoapServer () на PHP> = 5.6. Це попередження завжди буде оспорюватися у відповіді SOAP, так що __soapCall () SoapClient отримає "Виняток SoapFault: [Клієнт] виглядає так, що у нас немає жодного XML документа". Настільки важко налагоджувати, оскільки це попередження зазвичай не з’являється.
Джонні Вонг

Відповіді:


135

Виявляється, моє розуміння повідомлення про помилку було неправильним. Я б сказав, що у нього дуже поганий вибір слів. Гугл навколо показав мені, що хтось ще неправильно зрозумів повідомлення так само, як я - див. PHP-помилку # 66763 .

Після абсолютно недоброзичливого "Це те, як РМ хотіли, щоб це було". Відповідаючи на цю помилку Майком, Тірайл пояснює, що встановлення її на "-1" не означає лише попередження про те, щоб піти. Це робиться правильно , тобто повністю відключає заповнення винної змінної. Виявляється, встановивши його на 0 STILL заповнює дані за певних обставин. Розмова про поганий дизайн! Щоб цитувати PHP RFC :

Змініть налаштування INI always_populate_raw_post_data, щоб прийняти три значення замість двох.

  • -1: поведінка майстра; ніколи не заповнюйте $ GLOBALS [HTTP_RAW_POST_DATA]
  • 0 / вимкнено / будь-що: поведінка BC (заповнити, якщо тип вмісту не зареєстрований або метод запиту відрізняється від POST)
  • 1 / on / yes / true: поведінка BC (завжди заповнюйте $ GLOBALS [HTTP_RAW_POST_DATA])

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


23
tl; dr - це німе попередження, яке з’являється, навіть якщо ви не використовуєте те, про що попереджає; встановити завжди_populate_raw_post_data на -1
srcspider

7
я його встановив always_populate_raw_post_data = -1. досі попередження, що надходить і пошкоджує відповідь json
itsazzad

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, що є "сильнішим інвалідом"? → плутанина → причина цього питання (та відповіді).
rr-

39

Деякий час, поки я не натрапив на цю помилку Сформулюйте мою відповідь для всіх, хто може натрапити на це питання.

Помилка означає лише те, що ви надсилаєте порожній POST-запит. Ця помилка зазвичай зустрічається у HTTPRequests, без переданих параметрів. Щоб уникнути цієї помилки, ви завжди можете додати параметр до POST, не змінюючи php.ini.

Подібно до:

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

4
Це найкраща відповідь, яку я знайшов на це питання! Я з цією проблемою займався вже не один місяць, і це змусило мене подивитися в неправильному напрямку. У мене просто було випадкове пусте повідомлення, і коли це було виправлено, все працювало чудово! Дякую, що врятували мене від страшного головного болю!
Крейг Хоуелл

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

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

і шукайте значення ключа 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 (або натисніть кнопку Перезапустити всі сервіси)


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 petititon.

var xhr = $.ajax({
   url:  url,
   type: "POST",
   data: {name:'emtpy_petition_data', value: 'empty'}
   dataType: "html",
   timeout: 500,
});

4

Я отримав це повідомлення про помилку під час надсилання даних із форми HTML (метод публікації). Все, що мені потрібно було зробити, це змінити кодування у формі з "текст / звичайний" на "застосунок / x-www-form-urlencoded" або "multipart / form-data". Повідомлення про помилку було дуже оманливим.


2

На жаль, ця відповідь від @EatOng не є правильною . Прочитавши його відповідь, я додав змінну манекена до кожного запиту AJAX, який я запускав (навіть якщо у деяких з них вже були деякі поля), щоб переконатися, що помилка ніколи не з’являється.

Але тільки що я натрапив на ту саму прокляту помилку від PHP. Я подвійно підтвердив, що я надіслав деякі дані POST (деякі інші поля теж разом із змінною фіктивних даних). Версія PHP 5.6.25, always_populate_raw_post_dataзначення встановлено у 0.

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

Як відповідь @ rr- цитує,

0 / off / будь що: поведінка 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з тіла, що розміщено (оскільки PHP любить / розпізнає ціcontent-type заголовки !?).

ВАРІАНТ 4: ОСТАННІЙ РЕЗОРТ

Ну, я не хотів змінювати Content-Type AJAX, це спричинило б багато проблем для налагодження. (Chrome DevTools чудово переглядає розміщені змінні запитів 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);

Працює більше того ж. Я сподіваюся, що це заощадить комусь час налагодження :)


0

УВАГА: ЯКЩО ВИ ВИКОРИСТОВУЄТЕ PHPSTORM введіть тут опис зображення


Я витратив годину, намагаючись вирішити цю проблему, думаючи, що це моя проблема сервера php, тож у php.ini я встановив 'vedno_populate_raw_post_data' на '-1', і нічого не вийшло .

Поки я не дізнався, що використання phpStorm, вбудованого в сервер, є причиною проблеми, як детально описано у відповіді тут: Відповідь від LazyOne Here , Тож я подумав про те, щоб поділитися нею.


-1

; always_populate_raw_post_data = -1 у php.init видалити коментар до цього рядка .. always_populate_raw_post_data = -1


4
ви могли б пояснити ?? чому? Також належним чином відформатуйте / відріжте свою публікацію.
Раві

-1

Я просто отримав рішення цієї проблеми від друга. він сказав: Додати ob_start (); під кодом сеансу. Ви можете додати exit (); під заголовком. Я спробував це, і це спрацювало. Сподіваюся, це допомагає

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.