为 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); ?>
优化提示:
使用适当的内容相关标头:
不幸的是,在这种情况下设置标头来指示流式传输或未知内容长度并不简单。
关于flush()的注意事项:
需要注意的是,由于Apache的内部输出缓冲区溢出,在读取/回显循环中调用flush()可能会导致大文件和慢网络问题。因此,最好在代码中省略flush()调用。
以上是如何在 LAMP 堆栈上流式传输大型 Zip 文件以加快下载速度?的详细内容。更多信息请关注PHP中文网其他相关文章!