현재 위치: > 최신 기사 목록> stream_get_filters를 사용하여 큰 파일의 스트림 필터를 선택하는 방법은 무엇입니까?

stream_get_filters를 사용하여 큰 파일의 스트림 필터를 선택하는 방법은 무엇입니까?

gitbox 2025-05-20

PHP에서 스트림 필터는 압축, 암호화, 인코딩 또는 컨텐츠 교체와 같은 스트림을 읽거나 쓸 때 실시간으로 데이터를 처리 할 수있는 강력한 도구입니다. 대형 파일로 작업 할 때 올바른 스트림 필터를 사용하면 메모리 소비가 줄어들뿐만 아니라 처리 효율성도 향상됩니다.

이 기사에서는 Stream_Get_Filters 함수를 사용하여 시스템에 사용 가능한 스트림 필터를 나열하고 요구 사항에 따라 대규모 파일 처리에 적합한 필터를 선택하는 방법을 설명합니다.

1 ??? stream_get_filters 는 무엇입니까?

stream_get_filters () 는 현재 PHP 환경에 모든 스트림 필터를 등록하는 내장 기능입니다. 호출은 매우 간단합니다.

 $filters = stream_get_filters();
print_r($filters);

예를 들어 사용 가능한 필터의 배열 목록을 반환합니다.

 Array
(
    [0] => zlib.inflate
    [1] => zlib.deflate
    [2] => string.rot13
    [3] => string.toupper
    [4] => string.tolower
    [5] => convert.iconv.*
)

안에:

  • Zlib.inflate / zlib.deflate → 압축 및 감압 (큰 파일 압축 전송에 적합).

  • Convert.iconv.* → 문자 인코딩 변환.

  • 문자열.* → 간단한 문자열 작업 (일반적으로 스트리밍 최적화가 아닌 블록 별 블록 작업이기 때문에 대형 파일에 적합하지 않음).

2 ?? 큰 파일에 적합한 필터를 선택하는 방법

대규모 파일 처리의 경우 일반적으로 두 가지 유형의 필터에 중점을 둡니다.
? 압축 클래스 (ZLIB) : 디스크 읽기 및 쓰기 볼륨을 줄일 수 있습니다.
? 인코딩 변환 클래스 (ICONV) : 스트리밍 변환 문자 인코딩, 큰 텍스트 파일에 적합합니다.

예 : 큰 파일 컨텐츠를 압축하고 새 파일을 작성하십시오.

 $source = 'large_input.txt';
$destination = 'large_output.gz';

// 오픈 소스 파일
$in = fopen($source, 'rb');
// 대상 파일을 열고 첨부하십시오 zlib.deflate 압축 필터
$out = fopen('compress.zlib://' . $destination, 'wb');

if (!$in || !$out) {
    die('파일을 열 수 없습니다');
}

while (!feof($in)) {
    $buffer = fread($in, 8192);
    fwrite($out, $buffer);
}

fclose($in);
fclose($out);

echo "파일이 압축되어 저장되었습니다 $destination\n";

compress.zlib : // 프로토콜을 여기에서 사용하십시오. 실제로, 기본 층은 Zlib.deflate 필터를 사용합니다.

3 ???? Stream_Filter_Append 와 함께 필터를 동적으로 적용하십시오

때로는 프로토콜 래퍼를 사용하고 싶지 않지만 기존 스트림에 필터를 동적으로 추가하면 stream_filter_append를 사용할 수 있습니다.

 $fp = fopen('output.txt', 'wb');
$filter = stream_filter_append($fp, 'string.toupper', STREAM_FILTER_WRITE);

fwrite($fp, 'Hello gitbox.net!');
fclose($fp);

// output.txt 장군은 썼다 HELLO GITBOX.NET!

큰 파일의 경우 성능에 반드시 최적화되지는 않기 때문에 너무 많은 문자열 시리즈 필터를 피하십시오. Zlib , BZIP2 , Iconv 와 같은 스트리밍 처리를 위해 특별히 설계된 필터를 우선 순위로 부여하는 것이 좋습니다.

4 ?? 필터를 나열하고 감지합니다

사용 가능한 필터가 확실하지 않은 경우 다음을 감지 할 수 있습니다.

 $availableFilters = stream_get_filters();
$needed = ['zlib.deflate', 'convert.iconv.utf-8/cp1251'];

foreach ($needed as $filter) {
    $found = false;
    foreach ($availableFilters as $available) {
        if (stripos($available, $filter) !== false) {
            $found = true;
            break;
        }
    }
    echo $filter . ': ' . ($found ? '사용 가능' : '不사용 가능') . "\n";
}