php读取一个20G文件的最后10行
今天有同事在群里提问:如何读取一个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>

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu
