【发布时间】:2012-06-27 21:34:12
【问题描述】:
我有一个压缩文本文件,我试图在 PHP 中读取(使用 gzopen/gzgets)。该文件有点大,大约 158,000 行。该脚本工作正常,但当它到达文件的第 157,237 行时,它会读取该行的一部分,然后就像到达 EOF 一样。我能够解压缩文件并确认文件的其余部分确实存在。我写了一个简单的脚本来测试:
<?php
$handle = gzopen('/path/to/file.gz','r');
while(true) {
echo gzgets($handle,4096);
}
?>
它完美地读取了所有内容,然后突然到达这一行并打印:
GUAN XIN 508|R34745|CH|CGO|100|
没有别的。它只是坐在那里[非无限循环版本退出 while(!gzeof($handle))]
如果我将文件压缩并转到该行,我会看到:
GUAN XIN 508|R34745|CH|CGO|100| | | | |BEGS| | | | |133|19| | | | | | | | | | | | |413669000|1|
所以数据就在那里。我不知道的 zlib 函数是否存在某种大小限制?
更新:我通过 'cat -vet' 运行它来寻找特殊字符......什么都没有。
【问题讨论】:
-
内存不足?我不知道你对所有这些行做了什么,但如果你创建填充对象,你的内存可能会很快填满,你会得到堆栈溢出。
-
我同意你的观点,但在我发布的那个迷你脚本中,同样的事情发生了,即使它不应该在任何地方存储任何东西。我也已经尝试过提高 php 内存限制指令而没有任何变化。
-
我建议依次编辑每个单词,regzip,重新运行脚本并找出哪个单词破坏了它。如果您创建一个较小的文件进行测试,只有 150 行,中间是您的“中断”eof 行,它是否也会中断?
-
如果你找到了罪魁祸首,我建议你联系你正在使用的 gzip 库的制造商并提交错误报告。
-
嗯,这是一个很长的镜头,但是嘿:
gzopen('file.gz','rb');有什么改变吗?