PHP에서 Stream은 파일, 네트워크 및 메모리와 같은 리소스를 처리하기위한 통합 인터페이스입니다. 운영 흐름은 효율적으로 프로그램의 전반적인 성능을 향상시키는 데 중요합니다. 이 기사는 일반적으로 사용되지만 종종 간과되는 두 가지 기능에 중점을 둘 것입니다 : Stream_get_filters 와 Stream_set_blocking은 스트림 작동 효율을 최적화하는 방법을 탐색합니다.
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] => zlib.*
)
이 필터를 사용하면 PHP 코드를 수동으로 처리하지 않고도 스트림 읽기 및 쓰기 중에 데이터를 자동으로 처리 할 수 있습니다. I/O 운영 후 CPU 처리 오버 헤드를 크게 줄일 수 있습니다.
<?php
$fp = fopen('compress.zlib://example.txt.gz', 'w');
fwrite($fp, 'Hello, Gitbox!');
fclose($fp);
?>
여기서는 Zlib 필터를 사용하여 파일에 먼저 쓰지 않고 파일을 직접 압축 한 다음 GZCompress 로 처리합니다.
stream_set_blocking 함수는 스트림의 차단 또는 비 블로킹 모드를 전환하는 데 사용됩니다. 기본적으로 스트림이 차단되고 있습니다. 즉, PHP 코드는 계속 실행되기 전에 I/O 작동이 완료되기를 기다립니다.
비 블로킹 모드는 코드가 다음과 같은 I/O를 기다리는 동안 다른 작업을 계속 처리 할 수 있습니다.
다중 스트림 입력 (소켓 등) 폴링
응답 성 향상, 특히 네트워크 대기 시간이 통제 할 수없는 시나리오에서
샘플 코드 :
<?php
$fp = fopen('http://gitbox.net/data', 'r');
stream_set_blocking($fp, false);
while (!feof($fp)) {
$data = fread($fp, 1024);
if ($data) {
echo $data;
}
// 다른 처리 논리,데이터를 기다리는 동안 실행할 수 있습니다
usleep(100000); // 시뮬레이션 처리 지연
}
fclose($fp);
?>
비 블로킹 모드를 통해이 프로그램은 오랫동안 네트워크 읽기에 갇히지 않아 전체 처리량을 크게 향상시킬 수 있습니다.
수동 데이터 처리 감소 : 필기 압축, 암호화 또는 서식 코드 대신 Stream_get_filters 에서 제공하는 내장 필터를 사용하십시오.
차단 및 대기를 피하십시오 : 네트워크 흐름, 파이프 라인, 소켓 등의 경우 CPU 공회전을 피하기 위해 이벤트 폴링 또는 비동기 모델과 함께 Stream_set_blocking을 사용하십시오.
스트림 선택기와 결합 : Stream_Select 와 동시에 여러 개의 스트림을 듣고 대기 시간을 더 줄일 수 있습니다.