양식 POST와 fsockopen 제출 방법의 차이점을 비교하세요.
양식이 POST 모드로 제출되면
$_POST 및 php://input이 값을 얻을 수 있으며 $HTTP_RAW_POST_DATA는 비어 있습니다.
$_POST는 제출된 데이터를 연관 배열로 구성하고 urldecode와 같은 인코딩 처리는 물론 인코딩 변환까지 수행합니다.
php://input은 입력 스트림을 통해 파일을 읽어 처리되지 않은 POST 원시 데이터를 얻을 수 있습니다.
php://input을 사용하면 POST의 원시 데이터를 읽을 수 있습니다. $HTTP_RAW_POST_DATA보다 메모리에 대한 부담이 적고 특별한 php.ini 설정이 필요하지 않습니다. php://input은 enctype="multipart/form-data"와 함께 사용할 수 없습니다.
POST 데이터를 제출하는 fsockopen의 예:
$sock = fsockopen("localhost", 80, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)n");
$data = "txt=" . urlencode("中") . "&bar=" . urlencode("바 값");
fwrite($sock, "POST /posttest/response.php HTTP/1.0rn");
fwrite($sock, "호스트: localhostrn");
fwrite($sock, "콘텐츠 유형: application/x-www-form-urlencodedrn");
fwrite($sock, "콘텐츠 길이: " . strlen($data) . "rn");
fwrite($sock, "수락: */*rn");
fwrite($sock, "rn");
fwrite($sock, "$datarn");
fwrite($sock, "rn");
$헤더 = "";
while ($str = 트림(fgets($sock, 4096)))
$headers .= "$strn";
에코 "n";
$body = "";
동안 (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
echo $body;
(1)의 결과와 일치합니다
.
1. php://input을 사용하면 원본 POST 데이터를 쉽게 얻을 수 있습니다.
2. $HTTP_RAW_POST_DATA는 POST의 Content-Type 유형이 PHP에서 인식되지 않는 경우에만 유효합니다.
예를 들어 일반적으로 페이지 양식을 통해 제출되는 POST 데이터는 전달될 수 없습니다. $ HTTP_RAW_POST_DATA를 통해 추출됩니다. 해당 인코딩 유형 속성(enctype 속성)은 application/x-www-form-urlencoded, multipart/form-data입니다.
참고: 페이지의 enctype 속성을 PHP에서 인식되지 않는 유형으로 명시적으로 변경하더라도 여전히 유효하지 않습니다.
양식 제출 인코딩 속성은 양식이 제한되어 있으므로 인식할 수 없는 유형은 기본 인코딩(예: application/x-www-form-urlencoded)으로 제출된 것으로 간주됩니다.
3. 데이터가 application/x-www에 있는 경우에만 $_POST -form-urlencoded Type은 제출 시에만 얻을 수 있습니다.