php读取一个20G文件的最后10行
程序员文章站
2022-05-19 22:30:41
...
今天有同事在群里提问:如何读取一个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原文地址:php读取一个20G文件的最后10行, 感谢原作者分享。
推荐阅读
-
PHP实现读取一个1G的文件大小
-
php开发技巧之PHP实现读取一个1G的文件大小
-
使用php读取TXT文件的数据(单词、音标和翻译)到另一个TXT文件中,出现乱码,是什么原因?
-
php如何读取大文件的最后一行,file函数就不用了。
-
PHP实现读取一个1G的文件大小
-
PHP究竟能不能控制一个文件夹的读取
-
php如何读取大文件的最后一行,file函数就不用了。
-
php怎么读取大文件的最后一行,file函数就不用了
-
使用php读取TXT文件的数据(单词、音标和翻译)到另一个TXT文件中,出现乱码,是什么原因?
-
使用php读取TXT资料的数据(单词、音标和翻译)到另一个TXT文件中,出现乱码,是什么原因