>백엔드 개발 >PHP 튜토리얼 >대용량 파일을 메모리에 모두 로드하지 않고 PHP에서 어떻게 스트리밍할 수 있나요?

대용량 파일을 메모리에 모두 로드하지 않고 PHP에서 어떻게 스트리밍할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-19 22:38:15483검색

How Can I Stream Large Files in PHP Without Loading Them Entirely into Memory?

PHP에서 대용량 파일 스트리밍

PHP에 내장된 file_get_contents 함수는 파일을 문자열로 읽어오는 편리한 방법이지만 중요한 제한 사항: 전체 파일을 한 번에 메모리에 로드합니다. 이는 PHP 메모리 한도를 소진하고 스크립트 오류를 ​​유발할 수 있으므로 대용량 파일의 경우 문제가 될 수 있습니다.

다행히 대용량 파일을 메모리에 모두 로드하지 않고도 사용자에게 스트리밍할 수 있는 방법이 있습니다. 한 가지 기술은 readfile_chunked 함수를 사용하는 것입니다. 이 함수는 파일 이름을 인수로 사용하고 파일 내용을 지정된 크기의 청크로 출력 버퍼에 보냅니다.

다음은 readfile_chunked 함수를 사용하는 방법에 대한 예입니다.

define('CHUNK_SIZE', 1024 * 1024); // Size (in bytes) of tiles chunk

// 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 num. bytes delivered like readfile() does.
    }

    return $status;
}

// Check if the user is logged in
// ...

if ($logged_in) {
    $filename = 'path/to/your/file';
    $mimetype = 'mime/type';
    header('Content-Type: ' . $mimetype);
    readfile_chunked($filename);

} else {
    echo 'Tabatha says you haven\'t paid.';
}

이 예에서는 CHUNK_SIZE 상수를 정의하여 각 청크의 크기(바이트)를 지정합니다. 그런 다음 readfile_chunked 함수는 파일을 청크로 읽어서 출력 버퍼로 보냅니다. ob_flush 및 플러시 함수는 청크가 생성될 때 클라이언트에 전송되도록 호출됩니다.

이 기술을 사용하면 전체 파일을 메모리에 로드하지 않고도 대용량 파일을 사용자에게 스트리밍할 수 있습니다. 이는 HTTP 연결을 통해 대용량 파일을 전달하는 효율적인 방법입니다.

위 내용은 대용량 파일을 메모리에 모두 로드하지 않고 PHP에서 어떻게 스트리밍할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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