首页 > 后端开发 > php教程 > 如何在 PHP 中流式传输大文件而不将它们完全加载到内存中?

如何在 PHP 中流式传输大文件而不将它们完全加载到内存中?

Barbara Streisand
发布: 2024-12-19 22:38:15
原创
482 人浏览过

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 和 flash 函数以确保块在生成时发送到客户端。

此技术允许您将大文件流式传输给用户,而无需将整个文件加载到内存中。这是通过 HTTP 连接传送大文件的有效方法。

以上是如何在 PHP 中流式传输大文件而不将它们完全加载到内存中?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板