我的文件夹中包含的用户生成的图片相当大。当试图压缩这些时,我得到大约1.5 gig大小的zip文件的错误。
我的问题与内存有关,我认为php同时保持zip打开和内存中的所有图像。我可能的解决方案是将上传的每个图像发送到zip文件以及相应的文件夹,这似乎到目前为止工作但是zip文件大小的限制是什么,我可以找到大约4 gb。这如何影响/与服务器上的ram数量相互作用?\并且实际上是4gb的限制,还是我可以无限期地继续向zip添加文件,或者我应该让脚本检查zip的大小以及它是否超过X演出重命名并创建一个新的拉链。我搜索了谷歌并阅读了文档,但发现了相互矛盾的信息或不完整的信息,所以我正在寻找一些明确的答案和建议。感谢
答案 0 :(得分:13)
如果您仍想使用PHP ZipArchive,可以采取一些措施来防止某些服务器/操作系统限制:
内存虽然在您的情况下看起来很明显,但我已经看到很多关于如何使用ZipArchive的示例,它使用addFromString将新文件添加到存档中。别!这将分配内存以打开文件并将其内容存储在其中,这将使您快速耗尽内存,而是使用addFile。还要确保释放所有不需要的内存。
执行时间通过php.ini或ini_set(例如ini_set('max_execution_time', 600);
)最大限度地执行脚本的最长执行时间时间10分钟)
文件句柄某些操作系统对可能导致问题的打开文件数量有限制,因为PHP只会在您关闭zip文件后将文件添加到zip文件中。为了防止关闭打开文件数量的问题并在每个x文件(例如每1000个文件)中重新打开zip文件,这将迫使PHP压缩并添加已分配给存档的文件。
文件大小操作系统可能存在一些文件大小限制,更大的文件也意味着PHP需要更多内存来管理它,所以我个人更喜欢使用最大文件大小之后我只使用索引号打开一个新的zip文件。如果确切的文件大小对您无关紧要,您可以只计算进入存档的文件大小,然后在达到某个限制后进行切换,或者可以关闭每个x文件的存档并检查其在磁盘上的大小决定是否开始新的存档(请记住,只有在关闭存档时才会压缩文件)
我个人喜欢通过获取文件大小进入存档并对其应用可能的压缩因子来限制文件大小,以查看何时可能达到最大存档大小(jpg文件~0.9,zip文件= 1 ,文本文件~0.10,...)然后切换到下一个卷。
答案 1 :(得分:3)
使用php exec并在命令行上调用zip工具
exec("tar -zcvf archive.tar.gz /folder/tozip");
确保执行php文件的用户可以访问您要压缩的文件夹
并注意注射代码。
答案 2 :(得分:0)
由于流或内存可能仍在使用中,因此您必须" flush"在每个/一些文件之后从内存中存档:
$zip->close();
unset($zip);
$zip = new ZipArchive;
$zip->open("arch.zip");