在 Web 服务中,创建大量文件的 zip 进行下载可能会占用大量资源。传统方法涉及创建临时 zip 文件并将其回显给用户或将其保存到磁盘。但是,此方法会导致以下问题:
另一种方法是利用 Linux 命令行工具 zip 的流功能。通过使用像 ls -1 | 这样的管道命令zip -@ - |猫> file.zip、zip 可以在流模式下运行,从而最大限度地减少内存占用。在这种情况下,管道的作用相当于缓冲区;当缓冲区被填满时,操作系统暂时停止写入程序。这可确保 zip 的运行速度与随附程序的写入速度一致。
要使用 PHP 在 LAMP 堆栈上实现相同的流式传输机制,您需要可以利用 popen() 或 proc_open() 函数来执行 zip 命令。然后可以将命令的标准输出作为 PHP 流检索。通过结合这些技术,以下代码片段演示了如何在创建 zip 文件时将其流式传输给用户:
header('Content-Type: application/octet-stream'); header('Content-disposition: attachment; filename="file.zip"'); $fp = popen('zip -r - file1 file2 file3', 'r'); $bufsize = 8192; $buff = ''; while(!feof($fp)) { $buff = fread($fp, $bufsize); echo $buff; } pclose($fp);
此代码将 zip 文件直接流式传输到客户端,无需临时存储或内存消耗过多。它有效地模拟了 bash 代码片段中 cat 命令的功能。
以上是如何在 PHP 中传输大型 Zip 文件而不造成资源过载?的详细内容。更多信息请关注PHP中文网其他相关文章!