首頁 >php教程 >php手册 >php读取一个20G文件的最后10行

php读取一个20G文件的最后10行

WBOY
WBOY原創
2016-06-06 20:12:221118瀏覽

今天有同事在群里提问:如何读取一个20g的文件的最后10行。也就是说文件大小超过php内存限制。 今天尝试了一下,找到两种方式来完成这个任务。 1.调用系统命令tail -n 10 filename $ph = popen('tail -n 10 bigfile.txt','r');while($r = fgets($ph)){echo $

今天有同事在群里提问:如何读取一个20g的文件的最后10行。也就是说文件大小超过php内存限制。

今天尝试了一下,找到两种方式来完成这个任务。

1.调用系统命令tail -n 10 filename

$ph = popen('tail -n 10 bigfile.txt','r');
while($r = fgets($ph)){
echo $r;
}
pclose($ph);

当然调用系统命令的方式不止这一种,更多方法请参考http://blog.51yip.com/php/1064.html

2.第二种通过文件指针,每次读一行放到一个数组里面,超过10行,把最前面的一行删掉,知道读完整个文件

$fh = fopen('bigfile.txt','r');
$r = array();
while($l = fgets($fh)){
array_push($r,$l);
if(count($r)>10){
array_shift($r);
}
file_put_contents('memory.txt',memory_get_usage());
}
var_dump($r);

昨天一直在想,要是能找个移动文件指针的函数就好了,但是找了半个小时没找到。今天同事告诉我php的确有这样一个函数fseek,只不过是按字符移动而不是按行移动的。看了下手册,下面的评论中已经直接给出实现方案了.代码的实现和我起初的构想基本类似,包括一次性移动多个字符,然后计算剩余内容里面换行符的个数。

function tail($file, $num_to_get=10)
{
$fp = fopen($file, 'r');
$position = filesize($file);
fseek($fp, $position-1);
$chunklen = 4096;
while($position >= 0)
{
$position = $position - $chunklen;
if ($position = $num_to_get + 1)
{
preg_match("!(.*?\n){".($num_to_get-1)."}$!", $data, $match);
return $match[0];
}
}
fclose($fp);
return $data;
}

附上我生存这个大文件的方法

$s = '';
for($i =0;$i
    <p class="copyright">
        原文地址:php读取一个20G文件的最后10行, 感谢原作者分享。
    </p>
    
    


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn