使用PHP压缩大文件

5

我有一个包含许多复选框的php表单,每个复选框都包含指向文件的链接。一旦用户点击他们想要的复选框(文件),它就会将文件压缩并强制下载。

我已经成功实现了一个简单的php zip强制下载功能,但是当其中一个文件很大或者如果有人选择了整个列表进行压缩和下载时,我的服务器就会出错。

我知道可以增加服务器大小,但还有其他方法吗?


这些文件会经常更改吗?它们有多大? - Paolo Bergantino
5个回答

3

如果您确实需要通过PHP进行传输的话,最好使用流。使用流,内存需求非常低,并且不会随着内容大小的增加而增长。


虽然这些关于流的陈述在它们的使用情况下是正确的,但流无法完全解决这个问题。它们在PHP需要在脚本执行过程中处理流数据时非常有用,但就整体服务器行为而言,你最终仍然会一次性向Apache抛出大量数据块。 - Benji XVI


1

是你的服务器内存不足还是它不允许你将最终结果发送给客户端?如果只是内存不足,那么可以在文件系统上运行压缩。你可以使用 PHP 执行系统命令。

system("...command...");

因此,您可以根据用户选择,在临时目录中聚合所选文件(使用系统调用进行文件复制),然后压缩临时目录(使用系统调用调用pkzip),然后要求PHP将临时文件发送给客户端,之后您的PHP脚本可以删除它。

这样,压缩不会消耗您的PHP应用程序中的内存。


哇!谢谢,我有点困惑。您能否告诉我,如果要通过简单的复选框文件压缩包来实现您上述所说的所有功能,需要多少费用? - Joseph

0

您可以在Web服务器/PHP级别上启用gzip并跳过PHP脚本中的压缩。然后,只需要在调用readfile()之间输出正确的zip文件头。


-1
根据内容的动态程度和组合数的多少,您可以为每种组合预先构建一个压缩文件,并将其返回给用户。不过,如果选项有5个,您就必须维护32个不同的档案,这可能很快变得过时。

嘿,谢谢。我之前也考虑过那个方案,但是行不通。你还有其他的想法吗? - Joseph
你也没有提到是否达到了max_execution_time或者耗尽了memory_limit。如果你正在耗尽m_e_t,那么从system()调用运行pkzip仍然会计入时钟。 - mwalling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接