php fseek函数读取大文件两种方法


Posted in PHP onOctober 12, 2016

php读取大文件,使用fseek函数是最为普遍的方式,它不需要将文件的内容全部读入内存,而是直接通过指针来操作,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法.

方法一:

首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行。实现代码如下:

整个代码执行完成耗时 0.0095 (s)

function tail($fp,$n,$base=5)
{
  assert($n>0);
  $pos = $n+1;
  $lines = array();
  while(count($lines)< =$n){
    try{
      fseek($fp,-$pos,SEEK_END);
    } catch (Exception $e){
      fseek(0);
      break;
    }
    $pos *= $base;
    while(!feof($fp)){
      array_unshift($lines,fgets($fp));
    }
  }
  return array_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));

 方法二 :

还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换行符(n)的个数来判断是否已经读完最后$num行数据.实现代码如下

整个代码执行完成耗时 0.0009(s).

$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {
  while ($t != "n") {
    fseek($fp, $pos, SEEK_END);
    $t = fgetc($fp);
    $pos --;
  }
  $t = " ";
  $data .= fgets($fp);
  $line --;
}
fclose ($fp);
echo $data

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
GBK的页面输出JSON格式的php函数
Feb 16 PHP
配置php网页显示各种语法错误
Sep 23 PHP
curl实现站外采集的方法和技巧
Jan 31 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
PHP中比较时间大小实例
Aug 21 PHP
Laravel 5框架学习之向视图传送数据
Apr 08 PHP
基础的WordPress插件制作教程
Nov 24 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
PHP操作Redis数据库常用方法示例
Aug 25 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
php 无限分类 树形数据格式化代码
Oct 11 #PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 #PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 #PHP
php外部执行命令函数用法小结
Oct 11 #PHP
php字符串操作常见问题小结
Oct 11 #PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 #PHP
You might like
PHP下载文件的函数实例代码
2016/05/18 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
Python3安装Scrapy的方法步骤
2017/11/23 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
浅谈Python基础—判断和循环
2019/03/22 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
Pycharm中如何关掉python console
2020/10/27 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
交通安全学习心得体会
2016/01/18 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python