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 相关文章推荐
配置支持SSI
Nov 25 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
Apache连接PHP后无法启动问题解决思路
Jun 18 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
php版微信公众平台入门教程之开发者认证的方法
Sep 26 PHP
PHP 断点续传实例详解
Nov 11 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
Laravel中错误与异常处理的用法示例
Sep 16 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动态变静态原理
2006/11/25 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
JavaScript省市联动实现代码
2014/02/15 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
python多进程共享变量
2016/04/06 Python
浅析python继承与多重继承
2018/09/13 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
python多进程间通信代码实例
2019/09/30 Python
Python调用.NET库的方法步骤
2019/12/27 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
银行实习生的自我评价
2013/12/09 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
幼儿评语大全
2014/04/30 职场文书
房地产活动策划方案
2014/05/14 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
付款承诺函范文
2015/01/21 职场文书
房产证明范本
2015/06/19 职场文书
餐厅开业活动方案
2019/07/08 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
golang中的空slice案例
2021/04/27 Golang
详解MySQL中的主键与事务
2021/05/27 MySQL
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技