PHP에서는 스트림 (예 : 파일, 네트워크, 메모리 등)을 읽거나 작성할 때 데이터를 동적으로 변환하거나 처리 할 수있는 매우 강력한 도구입니다. 간단한 예를 들으려면 파일을 읽을 때 컨텐츠를 자동으로 압축, 압축 압축, 인코딩 및 필터링 할 수 있습니다.
PHP 프로그램의 성능을 더 잘 최적화하려면 현재 시스템에서 사용할 수있는 스트림 필터를 알아야하고 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 효율을 향상시킬 수 있습니다.
다음은 몇 가지 최적화 제안과 예입니다.
읽기 파일 컨텐츠를 압축하거나 인코딩 해야하는 경우 처리를 위해 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 파일에 데이터를 직접 씁니다.
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);
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