通常,Web服务需要压缩几个大文件以供客户端下载.最明显的方法是创建一个临时zip文件,然后将echo其创建给用户或将其保存到磁盘并重定向(将来某个时间删除它).
但是,这样做有缺点:
像ZipStream-PHP这样的解决方案通过将数据按文件铲入Apache文件来改进这一点.但是,结果仍然是高内存使用率(文件完全加载到内存中),以及磁盘和CPU使用率的大幅飙升.
相反,请考虑以下bash片段:
ls -1 | zip -@ - | cat > file.zip
# Note -@ is not supported on MacOS
Run Code Online (Sandbox Code Playgroud)
这里,zip以流模式运行,导致内存占用量低.管道具有整数缓冲区 - 当缓冲区已满时,OS会暂停写入程序(管道左侧的程序).这样可确保zip其输出速度与输出速度一样快cat.
然后,最佳方式是执行相同的操作:cat使用Web服务器进程替换,将zip文件流式传输给用户,并将其动态创建.与仅流式传输文件相比,这将产生很少的开销,并且将具有无问题的,非尖峰的资源配置文件.
如何在LAMP堆栈上实现这一目标?
我有一个 php 表单,它有一堆复选框,所有复选框都包含文件链接。一旦用户点击他们想要的复选框(文件),它就会压缩文件并强制下载。
我有一个简单的 php zip 强制下载可以工作,但是当其中一个文件很大或者有人说选择整个列表进行压缩和下载时,我的服务器就会出错。
我知道我可以增加服务器大小,但还有其他方法吗?