在php中压缩千位文件 - 内存泄漏

时间:2015-09-01 10:40:43

标签: php memory-leaks zip out-of-memory

我必须压缩包含最多10000个文件的搜索结果,其大小远远超过1Gb。

我创建一个zip存档并读取for循环whit fread中的每个文件,并将生成的文件添加到存档中。 由于此错误,我从未完成添加文件

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 1257723 bytes)

但我不认为在php.ini的memory_limit值中添加1Gb或更多可能是一个解决方案,因为内存资源有限。

由于zip文件将保留在内存中,直到它将被关闭(或者我在另一个问题中读到),我创建了一系列50Mb的zip文件,以避免内存泄漏。但即使php脚本创建另一个文件zip,它也会在同一个文件(第174个)上以相同的PHP致命错误停止。

为什么呢? 难道我做错了什么? 任何帮助将不胜感激。 这是文件创建的代码片段

$zip = new ZipArchive();
$nomeZipFile = "../tmp/" . $title . ".zip";

for ($x = 0; $x < count($risultato); $x++) {
    $numFiles = 0;
    $dir = '../tmp';
    if (file_exists($nomeZipFile)) {
        if (filesize($nomeZipFile) > 52428800) {
            // filename count
            if ($handle = opendir($dir)) {
                while (($file = readdir($handle)) !== false) {
                    if (!in_array($file, array('.', '..')) && !is_dir($dir . $file))
                        $numFiles++;
                }
            }
            $nomeZipFile = '../tmp/' . $title . $numFiles . '.zip';
            $res = $zip->open($nomeZipFile, ZIPARCHIVE::CREATE);
        } else {
            $res = $zip->open($nomeZipFile, ZIPARCHIVE::CREATE);
        }
    } else {
        $res = $zip->open($nomeZipFile, ZIPARCHIVE::CREATE);
    }
    ...
    // adding file
    $fileDownload = "";
    $fDownload = fopen($kt_response->message, "r"); // the file is downloaded though a webservice
    while(!feof($fDownload)) { $fileDownload .= fread($fDownload, 1024); flush(); }
    $zip->addFromString(filename, $fileDownload);
....
$zip->close();
}

0 个答案:

没有答案