Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php zip存档内存、ram和最大文件大小_Php_Memory Management_Ram_Ziparchive - Fatal编程技术网

php zip存档内存、ram和最大文件大小

php zip存档内存、ram和最大文件大小,php,memory-management,ram,ziparchive,Php,Memory Management,Ram,Ziparchive,我有一些文件夹,其中包含用户生成的图像,这些图像变得相当大。在尝试压缩这些文件时,我会遇到大约1.5 gig大小的压缩文件错误 我的问题与内存有关,我认为php同时打开了zip和内存中的所有图像。我有一个可能的解决方案,除了将上传的每个图像发送到相应的文件夹外,还将其发送到zip文件。到目前为止,这似乎是可行的,但是zip文件大小的限制是什么,从我能找到的大约4GB的限制来看。这是如何影响/影响服务器上的ram数量的?\限制是否实际为4gb,或者我是否可以继续无限期地将文件添加到zip,或者我是

我有一些文件夹,其中包含用户生成的图像,这些图像变得相当大。在尝试压缩这些文件时,我会遇到大约1.5 gig大小的压缩文件错误


我的问题与内存有关,我认为php同时打开了zip和内存中的所有图像。我有一个可能的解决方案,除了将上传的每个图像发送到相应的文件夹外,还将其发送到zip文件。到目前为止,这似乎是可行的,但是zip文件大小的限制是什么,从我能找到的大约4GB的限制来看。这是如何影响/影响服务器上的ram数量的?\限制是否实际为4gb,或者我是否可以继续无限期地将文件添加到zip,或者我是否应该让脚本检查zip的大小,如果超过X gigs,则重命名它并创建新的zip。我搜索了谷歌并阅读了文档,但发现了相互矛盾的信息或不完整的信息,所以我正在寻找一些明确的答案和建议。感谢使用php exec并在命令行上调用zip工具

 exec("tar -zcvf archive.tar.gz /folder/tozip");
确保执行php文件的用户有权访问要压缩的文件夹


并处理注入代码

如果您仍然想使用PHP,可以做一些事情来防止某些服务器/操作系统限制:

  • 内存虽然在您的案例中这似乎很明显,但我已经看到了许多关于如何使用ZipArchive将新文件添加到存档的示例。不要!这将分配内存以打开文件并将其内容存储在其中,这将使您的内存很快用完,请改用。还要确保释放所有不需要的内存

  • 执行时间通过php.ini或使用(例如
    ini\u集('max\u Execution\u time',600);
    增加脚本的最大执行时间,使其最大执行时间为10分钟)

  • 文件句柄一些操作系统对打开的文件数量有限制,这可能会导致问题,因为PHP仅在关闭zip文件后将文件添加到zip中。为了防止打开的文件数量出现问题,只需每x个文件(例如每1000个文件)关闭并重新打开zip文件,这将迫使PHP压缩并添加已分配给存档的文件

  • 文件大小操作系统可能会有一些文件大小限制,更大的文件也意味着PHP需要更多内存来管理它,因此我个人更喜欢使用最大文件大小,然后使用索引号打开一个新的zip文件。如果确切的文件大小对您来说无关紧要,您可以只计算进入存档的文件的大小,然后在达到某个限制后切换,或者您可以每x个文件关闭一次存档并检查磁盘上的大小,以决定是否启动新的存档(请记住,关闭存档后文件才会被压缩)


我个人喜欢通过获取进入存档的文件大小并对其应用可能的压缩因子来限制文件大小,以查看何时可能达到最大存档大小(jpg文件~0.9,zip文件=1,文本文件~0.10,…),然后切换到下一个卷。

因为流或内存可能仍在使用,您必须在每个/某些文件之后从内存中“刷新”存档文件:

$zip->close();
unset($zip);
$zip = new ZipArchive;
$zip->open("arch.zip");

php脚本在您的配置中可以有多少内存(请参阅php.ini==>phpinfo())您最好通过
exec()
执行一个外部
zip
。您不希望php进程占用大量ram。@Duke 32m开箱即用,但我将其设置为128mI将与exec()配合使用)还有zip,我总是在使用php处理如此大的文件时遇到问题128m仍然很少,我可以使用exec压缩的文件数量或最终文件的大小会有限制吗?通常不会,只要文件系统能够处理生成的文件,那么从文件夹添加所有文件的更好选择是
addGlob()