2012-05-20 337 views
3

我试图解压缩一个巨大的文件(400 + M压缩以及4G解压缩)使用php zip压缩文件。我只解压缩压缩文件中的一个csv文件..我感兴趣的文件解压缩超过4G ..我从文件末尾获得3条​​记录,并且该过程进入lala land。 。我指的是过程只是那张..没有输出..没有错误,没有循环它只是...我还没有线索,以什么做了..我的代码很简单:PHP解压缩大文件

$zip = new ZipArchive; 
$res = $zip->open($file); 
if ($res === TRUE) 
{ 
    $num = $zip->numFiles; 
    for($i = 0; $i < $zip->numFiles; $i++) 
    { 
     $filename = $zip->getNameIndex($i); 
    // if its the file I want then... 
     $content = ''; 
    // my output file .. yes I've already checked to make sure the dir exists 
     $unzipped = fopen($dir ."/2" . $filename , 'wb');   
     $fp = $zip->getStream($filename); 
     if(!$fp) exit("failed\n"); 
     while (!feof($fp)) 
     { 
    $chunkSize = 10240; 
    $contents = fread($fp, $chunkSize); 
     $fwrite = fwrite($unzipped, $contents); 
     } 
     fclose($fp); 
     fclose($unzipped); 
    } 

    $zip->close(); 
    fclose($filename); 

} 

我删除了写入另一个文件以跟踪进度的写入语句。我得到了大部分文件......(正如我所说的3个记录中缺少整个文件)......但这个过程似乎在某个地方发生......它发生在fread上,我无法弄清楚发生了什么事..它没有达到eof ..源是完整的(使用is_source($ fp)在fread之前进行检查..它不会抛出错误..关闭浏览器并不能阻止它..甚至不能停止阿帕奇..不得不关闭,结束它...

任何想法?

感谢

回答

1

听起来像一个错误是诚实的(在PHP)。

你可能想尝试输出呼叫到memory_get_usage()帮助您调试。但是,也请参阅stream_copy_to_stream(),因为您可以摆脱所有循环中的垃圾。它也可能是intresteting来保持写入的字节总数,以查看事情出错的数字是否可疑。

+0

据有人在文档页面中的功能似乎使用相当多的内存自身。所以如果这是真的,记忆是问题在这里,这可能不是解决方案。 – Blizz

+0

嗨克里斯,试着用有趣的结果,它没有复制整个文件,但它并没有进入拉拉陆地,这种导致我相信第一个问题可能是最初的zip流..它可能没有得到一切......但这是一个不同的问题,我需要在发布之前进行一些研究。再次感谢。 – Bridget

1

这是在黑暗中刺,但尝试增加脚本可以分配的内存量。使用gzip函数时我遇到了类似的问题,我必须做出这样的改变。

ini_set('memory_limit', '512M'); 
+0

嗨,尼克,感谢您的建议,尝试了它,但它没有任何不同..但无论如何感谢 – Bridget

0
$filename = '/media/file.gz'; 

$unzipped_content = ''; 
$zd = gzopen($filename, "r"); 
while ($zip_file = gzread($zd, 10000000)){ 
    $unzipped_content.= $zip_file; 
} 
gzclose($zd); 

echo $unzipped_content;