> php教程 > php手册 > 본문

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

WBOY
풀어 주다: 2016-06-06 20:12:22
원래의
1103명이 탐색했습니다.

今天有同事在群里提问:如何读取一个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>
    
    


로그인 후 복사
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿