PHP Stream
PHP Stream Reference: 스트림을 사용한 데이터 처리
PHP Streams는 파일, 네트워크 연결, 데이터 등 다양한 소스에서 데이터의 입출력을 처리할 수 있는 일관된 방법을 제공합니다. 스트림은 데이터를 한 번에 모두 처리하는 대신, 데이터를 순차적으로 읽거나 쓸 수 있어 메모리 효율적인 데이터 처리가 가능합니다. PHP는 파일 읽기, 네트워크 통신, 프로토콜 처리 등의 작업을 스트림으로 처리할 수 있도록 다양한 기능을 제공합니다.
이 가이드는 PHP에서 스트림을 사용하여 데이터를 처리하는 방법을 설명합니다.
1. 스트림의 기본 개념
스트림은 PHP에서 데이터를 입출력하는 기본 인터페이스입니다. 스트림을 사용하면 파일, 네트워크 연결, 데이터베이스, 메모리 등에서 데이터를 처리할 수 있습니다. 기본적으로 PHP의
fopen()
, fread()
, fwrite()
, fclose()
등의 함수는 스트림을 사용하여 데이터를
처리합니다.
2. 스트림 래퍼(Stream Wrappers)
PHP는 다양한 스트림 래퍼를 제공하여 파일 시스템뿐만 아니라 네트워크, 압축 파일, 데이터 프로토콜 등에 접근할 수 있습니다.
2.1 주요 스트림 래퍼
file://
: 파일 시스템에 접근합니다.http://
: HTTP 프로토콜을 통해 웹에서 데이터를 읽습니다.https://
: HTTPS 프로토콜을 사용하여 데이터를 읽습니다.ftp://
: FTP 프로토콜을 통해 파일을 전송하거나 읽습니다.-
: PHP의 메모리, 입출력 스트림에 접근합니다. (예:://
://input
,://output
,://memory
) data://
: 데이터 URI를 처리합니다.compress.zlib://
: zlib 압축 스트림을 처리합니다.
3. 스트림 함수
PHP는 스트림과 관련된 다양한 함수를 제공합니다. 이 함수들은 파일 입출력, 네트워크 통신, 프로토콜 처리 등 여러 작업을 수행할 수 있게 합니다.
3.1 fopen()
fopen()
함수는 스트림을 열고 스트림 리소스를 반환합니다.
-
구문:
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
-
예시:
<?php $file = fopen("example.txt", "r"); // 파일을 읽기 모드로 엽니다. if ($file) { echo "파일이 성공적으로 열렸습니다."; fclose($file); } ?>
3.2 fread()
fread()
함수는 스트림에서 데이터를 읽습니다.
-
구문:
string fread ( resource $handle , int $length )
-
예시:
<?php $file = fopen("example.txt", "r"); if ($file) { $content = fread($file, filesize("example.txt")); echo $content; fclose($file); } ?>
3.3 fwrite()
fwrite()
함수는 스트림에 데이터를 씁니다.
-
구문:
int fwrite ( resource $handle , string $string [, int $length ] )
-
예시:
<?php $file = fopen("example.txt", "w"); if ($file) { fwrite($file, "Hello, World!"); fclose($file); echo "파일에 데이터가 성공적으로 기록되었습니다."; } ?>
3.4 fclose()
fclose()
함수는 열린 스트림을 닫습니다.
-
구문:
bool fclose ( resource $handle )
-
예시:
<?php $file = fopen("example.txt", "r"); // 파일 작업 후 스트림을 닫음 fclose($file); ?>
4. php:// 래퍼
://
래퍼는 PHP 내부에서 사용되는 입출력 스트림에 접근할 수 있습니다. 이를 통해 표준 입력, 출력, 오류, 메모리, 데이터를 처리할 수 있습니다.4.1
://input
://input
은 HTTP 요청 본문에 접근할 수 있게 해주는 읽기 전용 스트림입니다. 특히,POST
요청의 원시 데이터를 읽을 때 유용합니다.
-
예시:
<?php $data = file_get_contents("php://input"); // HTTP 본문을 읽음 echo $data; ?>
4.2
://output
://output
://output
은 출력 스트림에 직접 쓰기를 허용하는 쓰기 전용 스트림입니다.
-
예시:
<?php $output = fopen("php://output", "w"); fwrite($output, "출력 스트림에 직접 쓰기"); fclose($output); ?>
4.3
://memory
및 ://temp
://memory
및 ://temp
-
: 메모리 기반의 스트림을 제공합니다. 크기에 관계없이 메모리에서만 작동합니다.://memory
-
: 임시로 메모리 또는 파일 시스템에 데이터를 저장할 수 있습니다. 지정된 크기를 초과하면 데이터가 임시 파일로 이동됩니다.://temp
-
예시:
<?php $memoryStream = fopen('php://memory', 'w+'); fwrite($memoryStream, '이것은 메모리에 저장된 데이터입니다.'); rewind($memoryStream); echo stream_get_contents($memoryStream); // 메모리에서 데이터 읽기 fclose($memoryStream); ?>
5. 스트림 컨텍스트
스트림 컨텍스트는 스트림이 열리거나 데이터를 읽고 쓸 때의 옵션을 설정할 수 있는 메커니즘입니다. 예를 들어 HTTP 요청에서 헤더를 설정하거나 FTP 연결 시 인증 정보를 제공하는 데 사용할 수 있습니다.
5.1 스트림 컨텍스트 생성
stream_context_create()
함수는 스트림에 대한 컨텍스트를 생성합니다.
-
구문:
resource stream_context_create ([ array $options [, array $params ]] )
-
예시:
<?php $context = stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => http_build_query(['name' => 'John', 'age' => 30]) ] ]); $result = file_get_contents('<https://example.com/api>', false, $context); echo $result; ?>
5.2 스트림 컨텍스트 옵션
스트림의 여러 종류에 대해 다양한 옵션을 설정할 수 있습니다. 다음은 자주 사용되는 옵션입니다.
-
HTTP 컨텍스트 옵션:
$options = [ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded\\\\r\\\\n", 'content' => 'name=John&age=30' ] ];
-
FTP 컨텍스트 옵션:
$options = [ 'ftp' => [ 'overwrite' => true ] ];
6. 스트림 필터
스트림 필터는 데이터를 읽거나 쓰는 동안 실시간으로 데이터를 처리할 수 있도록 해주는 메커니즘입니다. 예를 들어, 데이터를 압축하거나, 암호화하거나, 대문자로 변환하는 작업을 수행할 수 있습니다.
6.1 기본 스트림 필터 사용
PHP는 convert.*
, zlib.*
와 같은 다양한 기본 스트림 필터를 제공합니다.
-
예시: 대문자 변환 필터
<?php $stream = fopen('php://temp', 'w+'); fwrite($stream, 'hello world'); rewind($stream); stream_filter_append($stream, 'string.toupper'); // 문자열을 대문자로 변환하는 필터 추가 echo stream_get_contents($stream); // 출력: HELLO WORLD fclose($stream); ?>
6.2 사용자 정의 스트림 필터
PHP에서 사용자 정의 스트림 필터를 정의하여 데이터를 커스터마이즈된 방식으로 처리할 수 있습니다.
-
예시: 사용자 정의 필터 클래스 정의
<?php class MyFilter extends php_user_filter { public function filter($in, $out, &$consumed, $closing) { while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = strtoupper($bucket->data); // 데이터 대문자 변환 $consumed +=
$bucket->datalen; stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } }
stream_filter_register("myfilter", "MyFilter");
$stream = fopen('php://temp', 'w+'); fwrite($stream, 'hello world');
rewind($stream); stream_filter_append($stream, 'myfilter');
echo stream_get_contents($stream); // 출력: HELLO WORLD fclose($stream); ?>
---
### 7. 파일을 스트림으로 읽고 쓰기
#### 7.1 파일에서 읽기
`fopen()`, `fread()`, `file_get_contents()` 등으로 파일에서 데이터를 읽을 수 있습니다.
- **예시**:
```php
<?php
$file = fopen("example.txt", "r");
$content = fread($file, filesize("example.txt"));
fclose($file);
echo $content;
?>
7.2 파일에 쓰기
fwrite()
또는 file_put_contents()
로 파일에 데이터를 기록할 수 있습니다.
-
예시:
<?php $file = fopen("example.txt", "w"); fwrite($file, "PHP 스트림 예제"); fclose($file); ?>
요약
PHP Streams는 파일, 네트워크, 메모리, 데이터를 처리하는 강력한 방법을 제공합니다. 다양한 스트림 래퍼와 함수들을 사용하여 데이터를 효율적으로 읽고 쓰며, 스트림 필터를 통해 데이터를 실시간으로 처리할 수 있습니다. 이를 통해 PHP는 데이터를 메모리 효율적으로 다루는 기능을 제공하며, 스트림 컨텍스트와 필터는 커스터마이징된 입출력 작업을 가능하게 합니다.