`$ 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_data0 (비활성화)으로 설정 되었음을 보여줍니다 . 그래서 무슨 일이 일어나고 있습니까?

이 값을 -1로 설정하여 "경고를 방지"하고 싶지 않습니다. 이것은 경고를 숨길 뿐이며 여전히 더 이상 사용되지 않는 구성이 있습니다. 소스에서 문제를 해결하고 PHP가 HTTP_RAW_POST_DATA채우기가 켜져 있다고 생각하는 이유를 알고 싶습니다 .


동일한 문제이지만 가능한 다른 원인 / 해결 방법 : stackoverflow.com/questions/25984623/…
rr-

이 경고는 PHP> = 5.6에서 PHP SoapServer의 handle ()을 실행할 때 문제를 일으 킵니다. 이 경고는 항상 SOAP의 응답으로 출력되므로 SoapClient의 __soapCall ()은 "SoapFault 예외 : [Client]가 XML 문서가없는 것 같습니다."예외를 얻습니다. 이 경고는 일반적으로 표시되지 않으므로 디버깅하기가 어렵습니다.
Johnny Wong

답변:


135

오류 메시지에 대한 나의 이해가 잘못된 것으로 밝혀졌습니다. 나는 그것이 매우 열악한 단어 선택을 특징으로한다고 말하고 싶습니다. 인터넷 검색을 통해 다른 사람이 내가 그랬던 것처럼 메시지를 오해하는 것으로 나타났습니다 . PHP 버그 # 66763을 참조하십시오 .

전혀 도움이되지 않은 후 "이것은 RM이 원했던 방식입니다." Mike의 해당 버그에 대한 응답으로 Tyrael은 "-1"로 설정한다고 경고 만 표시되는 것이 아니라고 설명합니다. 그것은 않습니다 옳은 일을 완전히 범인 변수를 채우는 비활성화 즉,. 0으로 설정하면 일부 상황에서 여전히 데이터가 채워집니다. 나쁜 디자인에 대해 이야기하십시오! PHP RFC 를 인용하려면 :

always_populate_raw_post_data INI 설정을 변경하여 2 개 대신 3 개 값을 허용합니다.

  • -1 : 마스터의 행동; $ GLOBALS [HTTP_RAW_POST_DATA]를 채우지 마십시오.
  • 0 / off / whatever : BC 동작 (콘텐츠 유형이 등록되지 않았거나 요청 방법이 POST가 아닌 경우 채우기)
  • 1 / on / yes / true : BC 동작 (항상 $ GLOBALS [HTTP_RAW_POST_DATA] 채우기)

예, -1로 설정하면 메시지에서 말한 것처럼 경고를 피할 수있을뿐만 아니라 마침내이 변수를 채우지 못하게 됩니다.


23
tl; dr 이것은 경고하는 것을 사용하지 않아도 나타나는 멍청한 경고입니다. 세트 always_populate_raw_post_data도 -1
srcspider

7
나는 그것을 설정했다 always_populate_raw_post_data = -1. 아직 이제 경고가오고 JSON 응답을 손상
itsazzad

2
따라서 실제로 대답은 php.ini파일 로 이동하여 설정 (또는 주석 해제)하는 것 always_populate_raw_post_data = -1입니다.
John

그러나 나는 정말로 요점을 이해하지 못한다. 그것이 정확히 경고가 말하는 것입니까? To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
Andreas

@Andreas 요점은 그것이 명백하게 "비활성화 됨"인 0과 "강력한 비활성화 됨"인 -1의 차이를 말하는 이유입니다. → 혼란 →이 질문에 대한 이유 (및 답변).
rr-

39

이 오류를 발견 할 때까지 시간이 좀 걸렸습니다. 이 문제에 부딪 힐 수있는 모든 사람에게 내 대답을 올려주세요.

이 오류는 빈 POST 요청을 보내고 있음을 의미합니다. 이 오류는 일반적으로 매개 변수가 전달되지 않은 HTTPRequest에서 발견됩니다. 이 오류를 방지하려면 php.ini를 변경하지 않고 POST에 매개 변수를 항상 추가 할 수 있습니다.

처럼:

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

4
이 문제에 대해 내가 찾은 최고의 답변입니다! 나는이 문제를 한 달 동안 계속해서 다루어 왔으며 잘못된 방향을 보았습니다. 나는 단순히 우연히 빈 POST를 가지고 있었고 일단 수정되면 모든 것이 훌륭하게 작동했습니다! 끔찍한 두통에서 저를 구 해주셔서 감사합니다!
Craig Howell

34

nginx 서버 (DigitalOcean)에서 동일한 문제가 발생했습니다.로 로그인 root하여 파일을 수정 하기 만하면 됩니다 /etc/php5/fpm/php.ini.

always_populate_raw_post_dataI first run으로 줄을 찾으려면 다음을 수행하십시오 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.iniWAMP 에서 사용하는 위치는 다음과 같습니다.

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
내 주님 설명해주십시오
Zohaib

5

주석 해제

always_populate_raw_post_data = -1 

php.ini (line # 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를 변경 한 후에도 여전히이 문제로 어려움을 겪고있는 사람을 위해. POST매개 변수없이 ajax 청원을 할 때 오류가 발생하기 때문에 당신이해야 할 일은 send 메소드를 GET.

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

POST어떤 이유로 든 메소드를 유지하려는 경우 또 다른 옵션 은 ajax petititon에 빈 JSON 객체를 추가하는 것입니다.

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

4

html 형식 (Post 메서드)에서 데이터를 보낼 때이 오류 메시지가 나타납니다. 내가해야 할 일은 형식의 인코딩을 "text / plain"에서 "application / 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().NET에서 액세스 할 수있는 원시 POST 요청 본문에 있어야합니다 php://input.

@ rr- 인용의 대답으로,

0 / off / whatever : BC 동작 ( 콘텐츠 유형이 등록되지 않았 거나 요청 메서드가 POST 이외의 경우 채우기 ).

요청 방법이 확실한 POST이기 때문에 PHP가 내 Content-Type: application/json요청을 인식하지 못했거나 좋아하지 않았던 것 같습니다 (다시 말하지만, 왜 ??).

옵션 1:

여기에 제시된 많은 답변에 따라 php.ini파일을 수동으로 편집하고 범인 변수를로 설정 -1하십시오.

옵션 2 :

이것은 PHP 5.6 버그입니다. PHP를 업그레이드하십시오.

옵션 3 :

@ user9541305가 여기에서 대답했듯이 Content-TypeAJAX 요청을 변경 application/x-www-form-urlencoded하거나 POST 된 본문에서 multipart/form-dataPHP 를 채우게 됩니다 $_POST(PHP가 해당 content-type헤더를 좋아 / 인식하기 때문입니다 !?).

옵션 4 : 마지막 수단

글쎄, 나는 Content-TypeAJAX의 변경을 원하지 않았으며 디버깅에 많은 문제를 일으킬 것입니다. (Chrome DevTools는 JSON 요청의 POST 된 변수를 멋지게 봅니다.)

나는 클라이언트를 위해 이것을 개발 중이며 최신 PHP를 사용하거나 php.ini 파일을 편집하도록 요청할 수 없습니다. 최후의 수단으로로 설정되어 있는지 확인하고 설정되어 0있으면 php.iniPHP 스크립트 자체에서 파일을 편집합니다 . 물론 사용자에게 아파치를 다시 시작하도록 요청해야합니다. 부끄러운 일입니다!

다음은 샘플 코드입니다.

<?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 에서 'always_populate_raw_post_data''-1' 로 설정했지만 아무것도 작동하지 않았습니다.

서버에 내장 된 phpStorm을 사용하는 것이 여기에 대한 답변에 자세히 설명 된대로 문제의 원인이라는 것을 알기 전까지는 답변 : LazyOne Here , 그래서 공유에 대해 생각했습니다.


-1

; always_populate_raw_post_data = -1 in php.init이 줄의 주석 제거 .. always_populate_raw_post_data = -1


4
설명해 주시겠습니까 ?? 왜 ? 또한 게시물을 적절하게 형식화 / 들여 쓰기하십시오.
Ravi

-1

이 문제에 대한 해결책을 친구로부터 얻었습니다. 그는 말했다 : Add ob_start (); 세션 코드 아래. exit ();를 추가 할 수 있습니다. 헤더 아래. 나는 그것을 시도하고 작동했습니다. 도움이 되었기를 바랍니다

이것은 php.init 파일에 액세스 할 수없는 임대 호스팅 서버에있는 사람들을위한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.