현재 위치: > 최신 기사 목록> stream_get_filters를 사용하여 파일 흐름 필터를 얻고 성능 최적화를 수행하십시오.

stream_get_filters를 사용하여 파일 흐름 필터를 얻고 성능 최적화를 수행하십시오.

gitbox 2025-05-19

PHP에서는 스트림 (예 : 파일, 네트워크, 메모리 등)을 읽거나 작성할 때 데이터를 동적으로 변환하거나 처리 할 수있는 매우 강력한 도구입니다. 간단한 예를 들으려면 파일을 읽을 때 컨텐츠를 자동으로 압축, 압축 압축, 인코딩 및 필터링 할 수 있습니다.

PHP 프로그램의 성능을 더 잘 최적화하려면 현재 시스템에서 사용할 수있는 스트림 필터를 알아야하고 Stream_get_filters () 함수를 사용할 수 있습니다.

stream_get_filters는 무엇입니까?

stream_get_filters ()는 현재 시스템에서 등록 된 모든 스트림 필터 목록을 반환하기 위해 PHP의 내장 기능입니다. 기본 사용량은 매우 간단합니다.

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

출력은 다음과 같습니다.

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

이 필터의 이름은 Stream_Filter_Append () 또는 Stream_Filter_Prepend () 에서 스트림에 필터를 동적으로 첨부 할 수 있습니다.

유량 필터를 사용하여 성능을 향상시키는 방법은 무엇입니까?

stream_get_filters () 자체는 목록 일 뿐이지 만 필터를 사용하면 데이터 처리 흐름을 크게 최적화하고 코드 복잡성을 줄이며 I/O 효율을 향상시킬 수 있습니다.

다음은 몇 가지 최적화 제안과 예입니다.

1 ??? 수동 루프 처리를 피하십시오

읽기 파일 컨텐츠를 압축하거나 인코딩 해야하는 경우 처리를 위해 while 루프를 사용할 필요는 없지만 필터를 직접 사용할 수 있습니다.

예를 들어 자동 GZIP 압축 파일 쓰기 :

 $filename = 'example.txt.gz';
$fp = fopen($filename, 'w');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE);
fwrite($fp, '이것은 압축 해야하는 텍스트입니다.。');
fclose($fp);

이 코드는 수동 압축 및 여러 파일 작업을 피하고 성능 향상을 피하고 GZIP 압축으로 exames.txt.gz 파일에 데이터를 직접 씁니다.

2 ?? 중간 저장소를 줄입니다

UTF-8 인코딩 된 텍스트 파일을 ISO-8859-1 인코딩 스토리지로 변환해야한다고 가정하십시오. 먼저 메모리에 읽을 필요는없고 iConv ()를 사용하여 변환 할 필요가 없지만 필터를 직접 사용하십시오.

 $source = fopen('utf8file.txt', 'r');
$target = fopen('convertedfile.txt', 'w');
stream_filter_append($target, 'convert.iconv.UTF-8/ISO-8859-1', STREAM_FILTER_WRITE);

while (!feof($source)) {
    $line = fgets($source);
    fwrite($target, $line);
}

fclose($source);
fclose($target);

3 ???? 사용자 정의 필터와 함께

PHP는 로그 필터링, 민감한 워드 교체 등과 같은 특정 비즈니스 시나리오에 특히 유용한 사용자 정의 흐름 필터를 등록 할 수 있습니다.

 class UpperCaseFilter extends php_user_filter {
    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('string.uppercase', 'UpperCaseFilter');

// 필터 사용
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.uppercase');
fwrite($fp, 'hello gitbox.net!');
fclose($fp);

출력은 다음과 같습니다.

 HELLO GITBOX.NET!

요약

stream_get_filters ()는 성능 최적화의 시작점 일뿐입니다. 사용 가능한 도구를 이해하고 실제 최적화는 다음과 같습니다.

? 내장 필터를 사용하여 수동 데이터 처리를 줄입니다
? 중복 메모리 및 I/O 작업을 피하십시오
? 비즈니스 시나리오에 맞게 사용자 정의 필터를 작성하고 적용하십시오.

이러한 방법을 통해 파일 흐름, 네트워크 흐름, 메모리 흐름 및 기타 시나리오를 처리 할 때 PHP의 성능을 크게 향상시킬 수 있습니다.

더 알고 싶다면 공식 문서를 확인하십시오.
https://www.gitbox.net/manual/en/function.stream-get-filters.php