【问题标题】:When I create a zip file of a directory with a large zip file in PHP, I am facing a memory limit当我在 PHP 中创建带有大 zip 文件的目录的 zip 文件时,我面临内存限制
【发布时间】:2018-04-29 18:42:04
【问题描述】:

我的 WordPress 插件代码遇到内存限制错误。

我的代码:

function zipData($source, $destination) {
    if (extension_loaded('zip')) {
        if (file_exists($source)) {
            $zip = new ZipArchive();
            if ($zip -> open($destination, ZipArchive::CREATE) === TRUE)     {
                $source = realpath($source);
                if (is_dir($source)) {
                    $iterator = new RecursiveDirectoryIterator($source);

                    $iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
                    $files = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
                    foreach ($files as $file) {
                        $file = realpath($file);
                        if (is_dir($file)) {
                            $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
                        } else if (is_file($file)) {
                            $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
                        }
                    }
                } else if (is_file($source)) {
                    $zip->addFromString(basename($source), file_get_contents($source));
                }
            }
            return $zip->close();
        }
    }
    return false;
}

ini_set('max_execution_time', 600);
ini_set('memory_limit','1024M');
zipData($upload_dir['basedir'], $upload_dir['basedir'].'/Jincowboy/JinBackupMedia'. time() .'.zip');

我遇到了内存限制,所以我检查了 Google。

我发现需要生成流 zip 文件来避免内存限制,但我无法确认这一点。

我希望我的代码绕过此内存限制并允许基于包含大文件的目录创建 zip 文件。

我该如何解决这个问题?

【问题讨论】:

  • 您应该再试一次,粘贴代码,选择它并点击“代码示例”按钮...
  • 我正在尝试大文件拆分。但我不知道它会超时和内存不足或允许的内存限制。
  • 我在 file_get_contents 函数中允许内存限制和内存不足问题。所以我做了这个 $in = @fopen($file, "r"); while ($buff = fgets($in, 4096)) { $zip->addFromString(str_replace($source . '/', '', $file), $buff); } fclose($文件);但它不起作用

标签: php wordpress zip


【解决方案1】:

您可以尝试https://github.com/Grandt/PHPZip,它支持创建带有流数据的 ZIP 文件(大大降低了内存使用量)。

还有很多关于用大量答案的流进行压缩的 stackoverflow 帖子。

【讨论】:

  • 我查了github.com/Grandt/PHPZip 可以添加的最大文件是4GB,存档的总大小也不能超过4GB。所以这是不可能的。我想要任何大小的文件目录到 zip 文件中。
  • 总大小限制要么基于 FAT32,要么基于内存,PHP 32 的位引擎,如果您在 linux 或 NTFS 上使用 EXT3/4,则不存在限制。内存方面,如果您使用 64 位 PHP,您将受到机器上可用内存量的限制。
  • 感谢您的评论,DevionNL。但是 Wordpress 插件应该在任何地方都能正常工作
猜你喜欢
  • 2023-03-12
  • 2011-09-11
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多