【问题标题】:gzgets reaches end of file earlygzgets 提前到达文件末尾
【发布时间】: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'); 有什么改变吗?

标签: php zlib


【解决方案1】:

将 zlib 更新到 1.2.7。我们运行的是 1.2.3,显然在 1.2.4 中添加了“大文件”支持。

【讨论】:

  • 很高兴你找到了。我发现支持大于 2 GB 文件的操作系统要求您有效地说“西蒙说”,然后它们才能让您读取超过 2 GB(有时是 4 GB),这让我感到困惑。如果您不使用查找操作,它们应该让您一直阅读到文件的末尾,就像往常一样。 (在这种情况下,“Simon 说”是将“#define _FILE_OFFSET_BITS 64”放在源代码中,或者使用不同的定义来使 *64 版本的函数可用并使用它们。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多