4

100 MB 文件 --> 10 个 ZIP 调用(每次调用 10 MB zip) --> 1 个 ZIP 文件

我应该发起 10 次调用以将单个 100 MB 文件添加到 Zip 文件中(例如每次调用 10 MB 压缩)。

问题是我们有一个具有内存和时间限制的系统(它不会处理超过 10 到 15MB 的呼叫)。

所以压缩一个有很多调用的大文件是基本的想法。

如果需要,我准备提供更多数据。

4

2 回答 2

3

您以前尝试过 PECL Zip 吗?

只需使用以下代码压缩两个文件,没有任何内存限制问题。时间限制可能会被重置。我的环境:memory_limit 为 3MB,max_execution 时间为 20 秒。

<?php
set_time_limit(0);
$zip = new ZipArchive();
$zip->open('./test.zip', ZipArchive::CREATE);
$zip->addFile('./testa'); // 1.3 GB
$zip->addFile('./testb'); // 700mb
$zip->close();

注意: set_time_limit()在 php < 5.4 且 save_mode=on 时不起作用


另一种方法是在后台进程中创建 zip。这避免了可能的 memory_limit 问题。

这是一个例子: http: //pastebin.com/7jBaPedb

用法:

try {
  $t = new zip('/bin', '/tmp/test.zip');
  $t->zip();

  if ($t->waitForFinish(100))
    echo "Succes :)";
  else
    echo $t->getOutput();
} catch ($e) {
  echo $e->getMessage();
}

您可以在数据库中写入 pid 并在文件完成时提供文件,而不是等到进程结束...

于 2013-06-20T19:37:55.047 回答
2

阅读您的问题,我首先开始创建一个分块的 zip 打包程序,以按照您的要求进行操作。它会生成一个包含网页链接的数组,您必须按顺序打开该网页才能创建一个 zip 文件。当这个想法奏效时,我很快意识到它并不是真正需要的。

只有当打包程序尝试一次打开整个文件然后压缩它时,内存限制才是问题。幸运的是,一些聪明的人已经认为分块做起来更容易。

Asbjorn Grandt 是创建这个zip 类的人之一,它非常易于使用并且可以满足您的需求。

首先,我创建了一个非常大的文件。它将是 500MB 大小,其中包含各种字母。该文件是立即处理的方式,这会导致致命的内存限制错误。

<?php
$fh = fopen("largefile.txt", 'w');
fclose($fh);
$fh = fopen("largefile.txt", 'ab');
$size = 500;
while($size--) {
  $l = chr(rand(97, 122));
  fwrite($fh, str_repeat($l, 1024*1024));
}
fclose($fh);
?>

要使用 zip 类,我们会这样做:

<?php
include('zip.php');

$zip = new Zip();
$zip->setZipFile("largefile.zip");
//the firstname is the name as it will appear inside the zip and the second is the filelocation. In my case I used the same, but you could rename the file inside the zip easily.
$zip->addLargeFile("largefile.txt", "largefile.txt");
$zip->finalize();
?>

现在,在我的服务器上只需几秒钟即可创建大 zip,结果是一个 550KB 的文件。

现在,如果由于某些奇怪的原因您仍然需要在多个 Web 请求中执行此操作,请告诉我。我仍然有我开始做的代码。

于 2013-06-20T18:50:08.887 回答