PHP读取大文件末尾N行的高效方法推荐


Posted in PHP onJune 03, 2016

小文件几兆以内大小,都可以通过file()函数,将文件按行读入数组,在用array_pop取得最后一行,就可以了。

但是对于很大的文本文件来说,机器内存不够大,或者php本身memory_limit有限制,这个办法就不适用了,即使强行不限制,效率也是非常低的。

没有办法了吗?当然有,不过没有现成的函数了,需要自己动手了。

这里需要用到文件指针,学过C的应该知道指针式个嘛玩意,通俗的讲吧,PHP中通过fopen打开一个文件,这时候还没有读取文件,这时候指向的是文件开头,指针位置也就是0,当你通过fgets或者fgetc从文件中读取内容的时候,你读多少,指针也相应往前进多少,这也是

while(!feof($fp)){
$data.=fgets($fp,4096);
}

得以实现的原理,即fgets是从当前指针位置向后读取指定长度的字符串,直到遇见换行符为止。

那么可不可以控制指针的位置到倒数第N行位置呢?很遗憾,没有,但是可以将指针直接移动到末尾,并倒退N个位置,通过fseek()函数。

我们先将指针移动到末尾,并向后倒退2个位置,通过fgetc读取一个字符,判断这个字符是不是"\n"也就是换行符,如果不是换行符,那么继续倒退一个位置再次判断,直到我们倒退到上一行的结尾换行符为止,直接使用fgets将一整行都取出来即可。这里面用到两个while循环,外层循环控制需要取得的行数,内层循环控制fseek动作。

函数如下:

/**
 * 取文件最后$n行
 * @param string $filename 文件路径
 * @param int $n 最后几行
 * @return mixed false表示有错误,成功则返回字符串
 */
function FileLastLines($filename,$n){
  if(!$fp=fopen($filename,'r')){
    echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";
    return false;
  }
  $pos=-2;
  $eof="";
  $str="";
  while($n>0){
    while($eof!="\n"){
      if(!fseek($fp,$pos,SEEK_END)){
        $eof=fgetc($fp);
        $pos--;
      }else{
        break;
      }
    }
    $str.=fgets($fp);
    $eof="";
    $n--;
  }
  return $str;
}
echo nl2br(FileLastLines('sss.txt',4));

以上这篇PHP读取大文件末尾N行的高效方法推荐就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
设置php页面编码的两种方法示例介绍
Mar 03 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 PHP
利用php操作memcache缓存的基础方法示例
Aug 02 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 PHP
PHP策略模式写法
Apr 01 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 #PHP
PHP学习笔记之php文件操作
Jun 03 #PHP
ThinkPHP3.2.3实现分页的方法详解
Jun 03 #PHP
php for 循环使用的简单实例
Jun 02 #PHP
Yii多表联合查询操作详解
Jun 02 #PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 #PHP
yii2分页之实现跳转到具体某页的实例代码
Jun 02 #PHP
You might like
PHP变量内存分配问题记录整理
2013/11/27 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
jquery tab插件精简版分享
2011/09/10 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
python提取log文件内容并画出图表
2019/07/08 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
浅谈Python 函数式编程
2020/06/20 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
《雷雨》教学反思
2014/02/20 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
合作协议书格式范本
2016/03/21 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python