PHP에서 Streams는 많은 양의 데이터를 처리하기위한 강력한 도구입니다. 스트림을 사용하면 전체 데이터를 한 번에 메모리에로드하지 않고도 주문시 데이터를 읽고 쓸 수 있습니다. 일반적으로 사용되는 두 개의 스트림 작동 기능은 스트림 필터를 얻고 스트림 데이터를 복사하는 데 각각 사용되는 Stream_get_filters 및 Stream_copy_to_stream 입니다. 이 기사는이 두 기능을 사용하여 특히 큰 파일 또는 네트워크 데이터를 처리 할 때 효율적인 스트리밍 작업을 달성하는 방법을 설명합니다.
stream_get_filters 함수는 등록 된 스트림 필터를 모두 얻는 데 사용됩니다. 이 필터는 압축, 암호화 등과 같은 스트림에서 데이터를 처리 할 수 있습니다.이 필터를 사용하여 스트림 데이터를 읽거나 작성하여보다 유연한 스트림 작업을 달성 할 수 있습니다.
<?php
// 등록 된 스트림 필터를 모두 가져옵니다
$filters = stream_get_filters();
// 모든 스트림 필터를 출력합니다
echo "등록 된 스트림 필터:\n";
foreach ($filters as $filter) {
echo $filter . "\n";
}
?>
위의 코드를 실행하면 시스템에 등록 된 모든 스트림 필터 목록이 표시됩니다. 이 필터는 감압, 암호화 및 기타 읽기 데이터 처리와 같은 스트림 작업에 적용될 수 있습니다.
stream_copy_to_stream 함수는 한 스트림의 데이터를 다른 스트림으로 복사하는 데 사용됩니다. 이 기능은 특히 파일 작업 또는 네트워크 요청에 적합하며 데이터를 효율적으로 복사해야 할 때 매우 유용합니다. 큰 파일 복사 또는 네트워크 스트림에서 로컬 파일로 데이터를 복사하는 것이 지원됩니다.
<?php
// 오픈 소스 및 대상 파일
$source = fopen('http://gitbox.net/sample.txt', 'r'); // 이것이 네트워크 스트림이라고 가정하십시오
$destination = fopen('local_copy.txt', 'w'); // 대상 파일
if ($source && $destination) {
// 复制数据到대상 파일
$bytesCopied = stream_copy_to_stream($source, $destination);
echo "성공적으로 복사하십시오 $bytesCopied 바이트 데이터。\n";
// 스트림을 닫으십시오
fclose($source);
fclose($destination);
} else {
echo "无法打开源文件或대상 파일。\n";
}
?>
이 예에서는 네트워크 스트림 ( http://gitbox.net/sample.txt )에서 데이터를 스트리트 _copy_to_stream 함수를 통해 Local_copy.txt 에 로컬 파일로 가져옵니다. 이 프로세스는 전체 파일을 메모리에로드 할 필요가 없지만 데이터를 단계별로 읽고 씁니다.
Stream_get_filters 와 Stream_copy_to_stream을 결합하여보다 복잡한 스트림 작업을 구현할 수 있습니다. 예를 들어, 데이터를 복사하는 동안 스트림을 필터링하거나 압축하려면 복사하기 전에 해당 스트림 필터를 적용 할 수 있습니다.
<?php
// 오픈 소스 및 대상 파일
$source = fopen('http://gitbox.net/largefile.txt', 'r');
$destination = fopen('compressed_copy.txt', 'w');
// 检查源文件和대상 파일是否打开成功
if ($source && $destination) {
// 압축 유량 필터를 가져옵니다
$filter = stream_get_filters();
// 있는지 확인하십시오 zlib 압축 필터
if (in_array('zlib.deflate', $filter)) {
// 소스 스트림에 적용하십시오 zlib 압축 필터
stream_filter_append($source, 'zlib.deflate');
}
// 复制流数据并应用압축 필터
$bytesCopied = stream_copy_to_stream($source, $destination);
echo "성공적으로 압축 및 복사 $bytesCopied 바이트 데이터。\n";
// 스트림을 닫으십시오
fclose($source);
fclose($destination);
} else {
echo "无法打开源文件或대상 파일。\n";
}
?>
이 예에서는 먼저 Zlib.deflate 스트림 필터가 등록되었는지 여부를 확인하고 존재하는 경우 소스 스트림에 적용되어 대류 데이터의 압축을 달성합니다. 그런 다음 stream_copy_to_stream을 사용하여 압축 데이터를 대상 파일에 복사합니다.