>  기사  >  백엔드 개발  >  LAMP 스택은 어떻게 리소스 병목 현상 없이 효율적으로 ZIP 아카이브를 스트리밍할 수 있습니까?

LAMP 스택은 어떻게 리소스 병목 현상 없이 효율적으로 ZIP 아카이브를 스트리밍할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-10 05:10:02463검색

How Can a LAMP Stack Stream ZIP Archives Efficiently Without Resource Bottlenecks?

LAMP 스택에 스트리밍 ZIP 아카이브 생성: 리소스 병목 현상 제거

웹 서비스 환경에서 대용량 파일의 ZIP 아카이브를 생성하면 다음과 같은 문제가 발생합니다. 자원 집약적인 프로세스의 가능성. 기존 방식에서는 초기 지연, 높은 메모리 사용량 및 임시 디스크 공간 소비가 발생합니다.

과제

기존 방식의 단점은 다음과 같습니다.

  • ZIP 아카이브 초기 생성 중 CPU 및 디스크 스래싱
  • 사용자 대기 시간 연장
  • 요청당 상당한 메모리 공간
  • 임시 디스크 공간 사용량
  • 사용자가 다운로드를 도중에 취소하면 리소스 낭비

대체 솔루션

ZipStream-PHP는 파일별 처리를 사용하여 기존 방식을 개선합니다. 그러나 여전히 높은 메모리 사용량과 리소스 급증 문제에 직면해 있습니다.

최적의 접근 방식: 스트리밍 ZIP 생성

최적의 솔루션은 ZIP 파일을 다음으로 직접 스트리밍하는 것입니다. 사용자는 다음 bash 스니펫에 사용된 프로세스를 미러링합니다.

ls -1 | zip -@ - | cat > file.zip

여기서 zip 명령은 스트리밍 모드에서 작동하므로 메모리 사용량이 적습니다. 파이프는 cat이 출력을 작성할 수 있는 만큼만 zip이 빠르게 작동하도록 보장합니다.

LAMP 스택에서 구현

LAMP 스택에서 이러한 스트리밍 동작을 달성하려면 , popen() 또는 proc_open() 함수를 활용하여 unix 파이프라인을 실행할 수 있습니다. 다음 코드 조각은 이 개념을 보여줍니다.

<?php
// Send all necessary headers
header('Content-Type: application/x-gzip');

// Execute pipeline using popen
$fp = popen('tar cf - file1 file2 file3 | gzip -c', 'r');

// Stream archive to user
$bufsize = 65535;
$buff = '';
while( !feof($fp) ) {
   $buff = fread($fp, $bufsize);
   echo $buff;
}
pclose($fp);
?>

이 접근 방식은 비차단 I/O를 활용하여 LAMP 스택에서 ZIP 아카이브 스트리밍을 위한 리소스 오버헤드가 적은 솔루션을 제공합니다.

위 내용은 LAMP 스택은 어떻게 리소스 병목 현상 없이 효율적으로 ZIP 아카이브를 스트리밍할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.