IT story

PHP에서 POST 본문을 얻는 방법?

hot-time 2020. 4. 14. 19:13
반응형

PHP에서 POST 본문을 얻는 방법?


다음을 PHP 페이지에 POST로 제출합니다.

{a:1}

요청 본문입니다 (POST 요청).
PHP에서 그 값을 추출하려면 어떻게해야합니까?

var_dump($_POST); 

작동하지 않는 해결책이 아닙니다.


POST 또는 PUT 요청의 엔티티 본문 (또는 다른 HTTP 메소드)에 액세스하려면 다음을 수행하십시오.

$entityBody = file_get_contents('php://input');

또한 STDIN상수는 이미 열린 스트림 php://input이므로 다음과 같이 할 수도 있습니다.

$entityBody = stream_get_contents(STDIN);

I / O 스트림 문서PHP 수동 항목에서 :

php : // input 은 요청 본문에서 원시 데이터를 읽을 수있는 읽기 전용 스트림입니다. POST 요청의 경우, 사용하는 것이 바람직하다 PHP : // 입력 하는 대신 $HTTP_RAW_POST_DATA이 특별한 php.ini의 지시에 의존하지 않는. 또한 $HTTP_RAW_POST_DATA기본적으로 채워지지 않은 경우 always_populate_raw_post_data를 활성화하는 것보다 메모리를 덜 사용하는 대안입니다. enctype = "multipart / form-data"에는 php : // input을 사용할 수 없습니다.

특히 당신은주의하는 것이 좋습니다 php://input스트림에 관계없이 당신이 웹 SAPI에 액세스하는 방법, 시크하지 않습니다 . 이는 한 번만 읽을 수 있음을 의미합니다. 대규모 HTTP 엔터티 본문이 정기적으로 업로드되는 환경에서 작업하는 경우 위의 첫 번째 예와 같이 버퍼링하지 않고 스트림 형식으로 입력을 유지하고자 할 수 있습니다.

이와 같은 스트림 리소스를 유지하는 것이 도움이 될 수 있습니다.

<?php

function detectRequestBody() {
    $rawInput = fopen('php://input', 'r');
    $tempStream = fopen('php://temp', 'r+');
    stream_copy_to_stream($rawInput, $tempStream);
    rewind($tempStream);

    return $tempStream;
}

php://temp특정 양의 데이터가 저장된 후 파일 시스템 스토리지로 투명하게 전환되므로 메모리 소비를 관리 할 수 ​​있습니다 (기본적으로 2M). 이 크기는 php.ini 파일 또는 추가하여 조작 할 수있는 /maxmemory:NN곳, NN바이트, 임시 파일을 사용하기 전에 메모리에 유지하는 데이터의 최대 금액입니다.

물론, 입력 스트림을 찾는 이유가 없다면 웹 애플리케이션에서이 기능이 필요하지 않습니다. HTTP 요청 엔터티 본문을 한 번 읽는 것으로 충분합니다. 앱이 수행 할 작업을 파악하는 동안 클라이언트를 하루 종일 기다리지 마십시오.

HTML 형식 Content-Type: multipart/form-data헤더를 지정하는 요청에는 php : // input을 사용할 수 없습니다 enctype="multipart/form-data". 이것은 PHP가 이미 폼 데이터를 $_POST슈퍼 글로벌 로 파싱 한 결과입니다 .


비어있는 이유 $_POST는 요청이 아니 POST거나 POST더 이상 아니기 때문입니다 ... 요청으로 시작되었지만 어딘가에 리디렉션 301되었거나 302이로 전환되었습니다 GET!

검사 $_SERVER['REQUEST_METHOD']이러한 경우 확인.

이것이 발생하지 않아야하지만 여전히 발생하는 이유에 대한 자세한 내용은 https://stackoverflow.com/a/19422232/109787참조 하십시오 .


배열의 반환 값

 $data = json_decode(file_get_contents('php://input'), true);

변수 확인$HTTP_RAW_POST_DATA


HTTP PECL 확장을 설치 한 경우 http_get_request_body()함수를 사용하여 본문 데이터를 문자열로 얻을 수 있습니다.


당신이있는 경우 PECL을 / HTTP 확장 설치, 당신은이를 사용할 수 있습니다 :

$request = new http\Env\Request();
$request->getBody();

http_get_request_body()http://php.net/manual/fa/function.http-get-request-body.php 문서에 따라 본문 PUTPOST요청 을 얻기 위해 명시 적으로 만들어졌습니다 .

참고 URL : https://stackoverflow.com/questions/8945879/how-to-get-body-of-a-post-in-php

반응형