코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

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은 출력 스트림에 직접 쓰기를 허용하는 쓰기 전용 스트림입니다.

  • 예시:

    <?php
    $output = fopen("php://output", "w");
    fwrite($output, "출력 스트림에 직접 쓰기");
    fclose($output);
    ?>
    
    

4.3
://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는 데이터를 메모리 효율적으로 다루는 기능을 제공하며, 스트림 컨텍스트와 필터는 커스터마이징된 입출력 작업을 가능하게 합니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com