>백엔드 개발 >PHP 튜토리얼 >메모리 제한을 초과하지 않고 PHP에서 대용량 파일을 스트리밍하려면 어떻게 해야 합니까?

메모리 제한을 초과하지 않고 PHP에서 대용량 파일을 스트리밍하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-06 03:21:11607검색

How Can I Stream Large Files in PHP Without Exceeding Memory Limits?

PHP로 대용량 파일 스트리밍

PHP의 메모리 제한을 초과하는 대용량 파일을 처리할 때는 파일을 직접 스트리밍해야 합니다. 사용자의 브라우저를 메모리에 완전히 로드하지 않고 이 기술을 사용하면 메모리 소모 문제를 일으키지 않고 대용량 데이터를 효율적으로 처리할 수 있습니다.

파일 스트리밍에 대한 한 가지 접근 방식은 file_get_contents() 함수를 사용하는 것입니다. 그러나 이 방법을 사용하려면 전체 파일을 메모리에 로드해야 하기 때문에 대용량 파일에는 적합하지 않습니다.

이러한 한계를 극복하기 위해 파일을 더 작은 청크로 나누어 스트리밍하는 청킹 접근 방식을 구현할 수 있습니다. 순차적으로. 권장되는 접근 방식은 다음과 같습니다.

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

// 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;
}

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

이 코드에서 readfile_chunked() 함수는 파일을 1MB 청크로 나누고 각 청크를 사용자의 브라우저로 스트리밍합니다. 출력 버퍼를 플러시하면 전체 파일을 읽을 때까지 기다리지 않고 청크가 즉시 전송됩니다.

이 접근 방식을 구현하면 메모리 문제 없이 대용량 파일을 사용자에게 효율적으로 스트리밍할 수 있습니다.

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

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