qui*_*r42 9 php ram memory-management ziparchive
我有文件夹,用户生成的图像变得相当大.当试图压缩这些时,我得到大约1.5 gig大小的zip文件的错误.
我的问题与内存有关,我认为php同时保持zip打开和内存中的所有图像.我可能的解决方案是将上传的每个图像发送到zip文件以及相应的文件夹,这似乎到目前为止工作但是zip文件大小的限制是什么,我可以找到大约4 gb.这如何影响/与服务器上的ram数量相互作用?\并且实际上是4gb的限制,还是我可以无限期地继续向zip添加文件,或者我应该让脚本检查zip的大小以及它是否超过X演出重命名并创建一个新的拉链.我搜索了谷歌并阅读了文档,但发现了相互矛盾的信息或不完整的信息,所以我正在寻找一些明确的答案和建议.谢谢
Lar*_*zan 14
如果您仍想使用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,...)然后切换到下一个音量.
使用 php exec 并在命令行上调用 zip 工具
exec("tar -zcvf archive.tar.gz /folder/tozip");
Run Code Online (Sandbox Code Playgroud)
确保执行 php 文件的用户有权访问您要压缩的文件夹
并处理注入代码。