> 백엔드 개발 > PHP 튜토리얼 > 더 빠른 다운로드를 위해 LAMP 스택에서 대용량 Zip 파일을 스트리밍하는 방법은 무엇입니까?

더 빠른 다운로드를 위해 LAMP 스택에서 대용량 Zip 파일을 스트리밍하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-08 02:42:02
원래의
680명이 탐색했습니다.

How to Stream Large Zip Files on LAMP Stack for Faster Downloads?

LAMP 스택의 대용량 파일에 대한 즉시 Zip 파일 생성

문제:

사용자 다운로드를 위해 여러 개의 대용량 파일을 zip 파일로 생성할 때 기존 방법을 사용하면 과도한 CPU 및 디스크 사용량으로 인해 초기 단계에서 심각한 성능 문제가 발생합니다.

스트리밍을 사용한 해결 방법:

이 문제를 해결하기 위해 popen() 또는 proc_open()을 사용하여 zip 명령 파이프라인을 실행하고 stdout을 PHP 스트림으로 검색함으로써 zip의 스트리밍 기능을 활용할 수 있습니다. 이를 웹 서버 프로세스와 결합하면 zip 파일이 생성되는 즉시 사용자에게 스트리밍할 수 있습니다.

popen()을 사용한 구현:

<?php
// Set necessary headers
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="file.zip"');

// Execute zip command and retrieve stdout as a stream
$fp = popen('zip -r - file1 file2 file3', 'r');

// Read and echo data in chunks
$bufsize = 65535;
$buff = '';
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}
pclose($fp);
?>
로그인 후 복사

최적화 팁:

  • 적절한 버퍼 크기를 사용하세요(예: Benji가 댓글에서 제안한 대로 8192).
  • 마법 인용문을 끄세요. 필요한 경우
  • 최적의 성능을 위해 mb_http_output('pass')를 설정하세요.
  • 적절한 콘텐츠 관련 헤더를 사용하세요.

    • 콘텐츠 유형: 애플리케이션/zip
    • 콘텐츠 처리: 첨부 파일; filename="file.zip"

안타깝게도 이 맥락에서 스트리밍 또는 알 수 없는 콘텐츠 길이를 나타내기 위해 헤더를 설정하는 것은 간단하지 않습니다.

flush()에 대한 참고 사항:

읽기/에코 루프 내에서 플러시()를 호출하면 Apache의 내부 출력 버퍼 오버런으로 인해 대용량 파일 및 느린 네트워크에 문제가 발생할 수 있다는 점에 유의하는 것이 중요합니다. 따라서 코드에서는 플러시() 호출을 생략하는 것이 가장 좋습니다.

위 내용은 더 빠른 다운로드를 위해 LAMP 스택에서 대용량 Zip 파일을 스트리밍하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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