首页 >后端开发 >php教程 >如何在 LAMP 堆栈上流式传输大型 Zip 文件以加快下载速度?

如何在 LAMP 堆栈上流式传输大型 Zip 文件以加快下载速度?

Barbara Streisand
Barbara Streisand原创
2024-11-08 02:42:02680浏览

How to Stream Large Zip Files on LAMP Stack for Faster Downloads?

为 LAMP 堆栈上的大文件创建动态 Zip 文件

问题:

当创建多个大文件的 zip 文件供用户下载时,由于 CPU 和磁盘使用率较高,传统方法会在初始阶段导致严重的性能问题。

使用流式处理的解决方案:

为了解决这个问题,我们可以通过使用 popen() 或 proc_open() 来利用 zip 的流功能来执行 zip 命令管道并将 stdout 作为 PHP 流检索。通过将其与 Web 服务器进程相结合,我们可以在动态创建 zip 文件时将其流式传输给用户。

使用 popen() 实现:

<?php
// Set necessary headers
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="file.zip"');

// Execute zip command and retrieve stdout as a stream
$fp = popen('zip -r - file1 file2 file3', 'r');

// Read and echo data in chunks
$bufsize = 65535;
$buff = '';
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}
pclose($fp);
?>

优化提示:

  • 使用适当的缓冲区大小(例如,Benji 在评论中建议的 8192)。
  • 关闭魔术引号如有必要。
  • 设置 mb_http_output('pass') 以获得最佳性能。
  • 使用适当的内容相关标头:

    • 内容类型: application/zip
    • 内容处置:附件; filename="file.zip"

不幸的是,在这种情况下设置标头来指示流式传输或未知内容长度并不简单。

关于flush()的注意事项:

需要注意的是,由于Apache的内部输出缓冲区溢出,在读取/回显循环中调用flush()可能会导致大文件和慢网络问题。因此,最好在代码中省略flush()调用。

以上是如何在 LAMP 堆栈上流式传输大型 Zip 文件以加快下载速度?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn