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笔记之:php数组相关函数的使用
Apr 26 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
php curl的深入解析
Jun 02 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
php小经验:解析preg_match与preg_match_all 函数
Jun 29 PHP
PHP获取文件的MD5值并判断是否被修改的例子
Jun 19 PHP
php输出全球各个时区列表的方法
Mar 31 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
smarty自定义函数用法示例
May 20 PHP
thinkphp 验证码 的使用小结
May 07 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
实例分析10个PHP常见安全问题
Jul 09 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
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
Python random模块常用方法
2014/11/03 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
python实现网站微信登录的示例代码
2019/09/18 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
建筑工程管理专业自荐信范文
2013/12/28 职场文书
周年庆典主持词
2014/04/02 职场文书
小学家长学校培训材料
2014/08/24 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
校园广播稿100字
2014/10/06 职场文书
走群众路线学习笔记
2014/11/06 职场文书
租车协议书范本2014
2014/11/17 职场文书
开学第一天的感想
2015/08/10 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js