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 setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
PHP实现多图片上传类实例
Jul 26 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
使用PHP接受文件并获得其后缀名的方法
Aug 05 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
Yii全局函数用法示例
Jan 22 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 PHP
php探针不显示内存解决方法
Sep 17 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中计算字符串相似度的函数代码
2012/12/29 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php按单词截取字符串的方法
2015/04/07 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
js实现3D旋转效果
2020/08/18 Javascript
Python中生成器和迭代器的区别详解
2018/02/10 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
行政助理岗位职责
2013/11/10 职场文书
客服服务心得体会
2013/12/30 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
决心书范文
2014/03/11 职场文书
社会实践评语
2014/04/28 职场文书
微电影大赛策划方案
2014/06/05 职场文书
关于安全的标语
2014/06/10 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
分析Python list操作为什么会错误
2021/11/17 Python