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下将XML转换为数组
Jan 01 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
PHP实现的MongoDB数据库操作类分享
May 12 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
php smtp实现发送邮件功能
Jun 22 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 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 parse_url 一个好用的函数
2009/10/03 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
10个php函数实用却不常见
2015/10/13 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
extjs form textfield的隐藏方法
2008/12/29 Javascript
js 操作符实例代码
2009/10/24 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
如何为你的JS项目添加智能提示与类型检查详解
2019/03/12 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
pycharm设置注释颜色的方法
2018/05/23 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
关于赌博的检讨书
2014/01/08 职场文书
安全生产管理责任书
2014/04/16 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
Python OpenCV实现图像模板匹配详解
2022/04/07 Python