PHP php:// 스트림 래퍼란?
PHP에서 php://는 파일을 다루듯이 다양한 I/O 스트림에 접근할 수 있게 해주는 특수한 스트림 래퍼(wrapper)입니다. 이를 통해 표준 입력·출력·오류 스트림은 물론, 메모리 기반 스트림, 디스크 임시 파일 기반 스트림, 그리고 필터가 적용된 스트림까지 모두 활용할 수 있습니다.
표준 스트림 (Standard Streams)
php://stdin, php://stdout, php://stderr는 각각 PHP 프로세스의 표준 입력 장치, 표준 출력 스트림, 오류 스트림에 직접 접근할 수 있게 해줍니다. 또한 미리 정의된 상수인 STDIN, STDOUT, STDERR를 통해서도 동일한 스트림에 접근할 수 있습니다.
php://input
php://input은 HTTP 요청 본문(request body)에 담긴 원본(raw) 데이터를 읽기 전용으로 가져올 때 사용합니다. 참고로 과거에는 $HTTP_RAW_POST_DATA 변수로 같은 데이터를 얻을 수 있었지만, 이 변수는 현재 폐기(deprecated)되었습니다. 단, 폼의 enctype이 multipart/form-data로 설정된 경우에는 php://input을 사용할 수 없습니다.
php://output
이 래퍼는 쓰기 전용(write-only) 스트림을 나타내며, print나 echo 문과 유사한 방식으로 출력 버퍼링 메커니즘을 제공합니다.
php://fd
파일 디스크립터(file descriptor)에 직접 접근할 수 있는 래퍼입니다. 표준 스트림인 STDIN, STDOUT, STDERR에는 각각 1, 2, 3번 파일 디스크립터가 할당되며, 이후에 열리는 스트림에는 순차적으로 증가하는 번호가 부여됩니다. 예를 들어 php://fd/5는 5번 파일 디스크립터를 가리킵니다.
php://memory와 php://temp
php://memory는 데이터를 일시적으로 메모리에 저장하는 읽기/쓰기 가능한 스트림입니다. php://temp 역시 비슷하게 동작하지만, 차이점은 데이터를 메모리 대신 임시 파일에 저장한다는 점입니다.
php://filter
이 래퍼는 스트림을 여는 시점에 필터(filter)를 적용할 수 있게 해줍니다. 필터는 특히 readfile(), file_get_contents(), file() 함수와 함께 사용할 때 매우 유용합니다.
주요 래퍼 한눈에 보기
| 래퍼 | 설명 |
|---|---|
| php://stdin | 표준 입력 스트림 (읽기 전용) |
| php://stdout | 표준 출력 스트림 (쓰기 전용) |
| php://stderr | 표준 오류 스트림 (쓰기 전용) |
| php://input | HTTP 요청 본문의 원본 데이터 (읽기 전용) |
| php://output | 출력 버퍼 (쓰기 전용) |
| php://fd | 파일 디스크립터 직접 접근 |
| php://memory | 메모리 기반 임시 저장 스트림 |
| php://temp | 임시 파일 기반 저장 스트림 |
| php://filter | 스트림에 필터 적용 |
사용 예제
다음 예제는 콘솔 입력을 php://stdin으로 읽어 들인 후, php://stdout으로 화면에 출력하는 코드입니다.
<?php
$file=fopen("php://stdin","r");
$x=fread($file,10);
echo $x;
$out=fopen("php://stdout","w");
fwrite($out, $x);
fclose($file);
?>php://input 스트림 래퍼를 사용하면 HTTP 요청의 원본 데이터를 손쉽게 가져올 수 있습니다. 아래 예제는 HTML 폼이 POST 방식으로 PHP 스크립트에 데이터를 전송하는 상황입니다.
<html>
<body>
<form action="testscript.php" method="POST">
<input type="text" name="name">
<input type="text" name="age">
<input type ="submit" value="submit">
</form>
</body>
</html>HTTP 요청의 원본 데이터를 받아 처리하는 PHP 스크립트는 다음과 같습니다.
<?php
$json = file_get_contents("php://input");
$data = json_decode($json);
print_r($json);
?>