我们有一个8 GB的文件,每行是serialize()
输出,因此它可以包含二进制数据。但我注意到数据不包含0x0A
字节,该字节用于分隔文件中的行。
函数fgets()
没有帮助,因为它检测到0x0A
或0x0D
个字节的行尾,因此fgets()
会看到更多的行分隔符比存在。
是否有fgets()
版本仅使用0x0A
字节作为我的案例的行分隔符?
是否有另一种方法没有编写我自己的读缓冲解析线发射解决方案?
P.S。 file_get_contents()
不喜欢大于2GB的文件。
答案 0 :(得分:2)
您可以尝试:
string stream_get_line ( resource $handle , int $length [, string $ending ] );
//i.e.
string stream_get_line ($handle , filesize($myFile) , '\n' );
答案 1 :(得分:1)
<强>解决方案强>
我目前的解决方案基于用户Jonid Bendo的评论:
stream_get_line()
(http://php.net/manual/en/function.stream-get-line.php),但在我的平台上,stream_get_line()
不会返回超过8192个字节的行,因此我使用它周围的循环来检测并重建更长的字符串:
$master = "";
do
{
$line = stream_get_line ($handle, 1024*128, "\n");
$ll = strlen($line);
if ($ll < 1) {
break;
}
$badline = ($ll == 8192) && ('\n' != $line[$ll-1]);
$master .= $line;
} while( $badline );