>백엔드 개발 >PHP 튜토리얼 >메모리 고갈을 방지하기 위해 PHP에서 대용량 파일을 효율적으로 스트리밍하려면 어떻게 해야 합니까?

메모리 고갈을 방지하기 위해 PHP에서 대용량 파일을 효율적으로 스트리밍하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-05 14:38:15493검색

How Can I Efficiently Stream Large Files in PHP to Avoid Memory Exhaustion?

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

과도한 비용을 소비하지 않고 사용자에게 대용량 파일을 한 번에 안전하게 다운로드하도록 제공하려는 시나리오에서 메모리에서 질문이 생깁니다: 어떻게 파일을 효율적으로 스트리밍할 수 있습니까?

file_get_contents()를 사용하여 일반적인 접근 방식을 사용하면 전체 파일 콘텐츠를 동시에 검색하는 것은 잠재적인 메모리 제한으로 인해 비실용적입니다. 이 문제를 해결하려면 관리 가능한 청크로 데이터를 전달하는 스트리밍 방법을 사용하는 것이 좋습니다.

온라인 소스에서 제안된 한 가지 해결책은 readfile_chunked() 함수를 사용하는 것입니다. 이 기능을 사용하면 청크 크기를 지정하고 파일 콘텐츠를 반복적으로 읽고 출력하여 메모리 과부하를 피할 수 있습니다.

제공된 코드 샘플은 이 접근 방식의 구현을 보여줍니다.

// Define the chunk size in bytes
define('CHUNK_SIZE', 1024*1024);

// Function to read a file and display its content chunk by chunk
function readfile_chunked($filename, $retbytes = TRUE) {
    $buffer = '';
    $cnt = 0;
    $handle = fopen($filename, 'rb');

    if ($handle === false) {
        return false;
    }

    while (!feof($handle)) {
        $buffer = fread($handle, CHUNK_SIZE);
        echo $buffer;
        ob_flush();
        flush();

        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }

    $status = fclose($handle);

    if ($retbytes & $status) {
        return $cnt; // Return the number of bytes delivered.
    }

    return $status;
}

// Restrict access to logged-in users
if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: '.$mimetype );
    readfile_chunked($filename);
} else {
    echo 'Access denied.';
}

이 접근 방식 관리 가능한 청크로 파일을 스트리밍하여 메모리 제약을 피하고 파일을 사용자에게 효율적으로 전달합니다.

위 내용은 메모리 고갈을 방지하기 위해 PHP에서 대용량 파일을 효율적으로 스트리밍하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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