我正在尝试使用php zip存档解压缩一个巨大的文件(400 + M压缩好4G解压缩)。我只是解压缩压缩文件中的一个csv文件..我感兴趣的文件,解压缩,超过4G ..我从文件的末尾得到3条记录,然后进入lala land。我的意思是这个过程只是继续..没有输出..没有错误没有循环它只是继续...我不知道它在做什么...我的代码很简单:
$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条记录)......但是这个过程似乎在某个地方发生了......它发生在恐惧中我无法弄清楚发生了什么..它还没有达到eof ..源是完整的(在fread之前用is_source($ fp)检查..它没有抛出错误..关闭浏览器不会停止它...甚至无法停止apache ..必须关闭以结束它...
任何想法??
感谢
答案 0 :(得分:1)
听起来像是一个诚实的错误(在PHP中)。
您可能想尝试输出对memory_get_usage()的调用来帮助您进行调试。但是,同样,请参阅stream_copy_to_stream(),因为您可以摆脱所有循环障碍。它可能也是为了保持一个运行的字节总数来编写,以查看出错的数字是否看起来很可疑。
答案 1 :(得分:1)
这是在黑暗中刺伤,但尝试增加脚本可以分配的内存量。我在使用gzip函数时遇到了类似的问题,我不得不做出这样的改变。
ini_set('memory_limit', '512M');
答案 2 :(得分: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;