首页 >后端开发 >php教程 >如何在 PHP 中传输大文件而不超出内存限制?

如何在 PHP 中传输大文件而不超出内存限制?

Barbara Streisand
Barbara Streisand原创
2024-12-06 03:21:11606浏览

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

使用 PHP 流式传输大文件

当处理超出 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