> 백엔드 개발 > PHP 튜토리얼 > 리소스에 부담을 주지 않고 PHP에서 대용량 Zip 파일을 스트리밍하는 방법은 무엇입니까?

리소스에 부담을 주지 않고 PHP에서 대용량 Zip 파일을 스트리밍하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-07 21:02:02
원래의
718명이 탐색했습니다.

How to Stream Large Zip Files in PHP Without Resource Overwhelm?

리소스 부담 없이 즉시 대용량 파일의 .Zip 생성

웹 서비스에서 다운로드할 광범위한 파일의 zip을 생성하는 것은 리소스 집약적일 수 있습니다. 일반적인 접근 방식에는 임시 zip 파일을 생성하여 사용자에게 에코하거나 디스크에 저장하는 작업이 포함됩니다. 그러나 이 방법을 사용하면 다음과 같은 문제가 발생합니다.

  • 초기 리소스 급증: 파일 생성 단계에서 CPU 및 디스크 사용량이 급증합니다.
  • 다운로드 지연: 아카이브 완료를 기다리는 사용자에게 눈에 띄는 지연.
  • 과도한 메모리 공간: 파일 처리 중 상당한 메모리 소비.
  • 디스크 공간 활용: 파일 저장을 위한 임시 디스크 공간 생성.
  • 취소 시 리소스 낭비: 사용자가 다운로드 도중에 취소할 경우 초기 단계에서 소모된 모든 리소스가 낭비됩니다.

리소스 소비 극복

대안 접근 방식은 Linux 명령줄 도구인 zip의 스트리밍 기능을 활용하는 것입니다. ls -1 | 우편번호 -@ - | 고양이 > file.zip, zip은 스트리밍 모드에서 작동할 수 있으므로 메모리 사용량이 최소화됩니다. 이 컨텍스트에서 파이프는 버퍼 역할을 합니다. 버퍼가 가득 차면 운영 체제는 쓰기 프로그램을 일시적으로 중단합니다. 이렇게 하면 zip이 동반 프로그램의 쓰기 속도에 맞는 속도로 작동합니다.

PHP를 사용하여 Zip 파일 스트리밍

PHP를 사용하여 LAMP 스택에서 동일한 스트리밍 메커니즘을 달성하려면 popen() 또는 proc_open() 함수를 활용하여 zip 명령을 실행할 수 있습니다. 그런 다음 명령의 stdout을 PHP 스트림으로 검색할 수 있습니다. 다음 코드 조각은 이러한 기술을 결합하여 zip 파일이 생성되는 동안 사용자에게 zip 파일을 스트리밍하는 방법을 보여줍니다.

header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');

$fp = popen('zip -r - file1 file2 file3', 'r');
$bufsize = 8192;
$buff = '';

while(!feof($fp)) {
   $buff = fread($fp, $bufsize);
   echo $buff;
}
pclose($fp);
로그인 후 복사

이 코드는 임시 저장 장치나 필요 없이 zip 파일을 클라이언트에 직접 스트리밍합니다. 과도한 메모리 소비. 이는 bash 스니펫에서 cat 명령의 기능을 효과적으로 에뮬레이트합니다.

위 내용은 리소스에 부담을 주지 않고 PHP에서 대용량 Zip 파일을 스트리밍하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿