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 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
php Memcache 中实现消息队列
Nov 24 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
php使用反射插入对象示例分享
Mar 11 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 PHP
浅谈PHPANALYSIS提取关键字
Mar 08 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
Jun 13 PHP
laravel 实现划分admin和home 模块分组
Oct 15 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
基于xcache的配置与使用详解
2013/06/18 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
php创建sprite
2014/02/11 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
jquery插件之easing 动态菜单
2010/08/21 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
django admin组件使用方法详解
2019/07/19 Python
django的ORM操作 增加和查询
2019/07/26 Python
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
统计员岗位职责范本
2015/04/14 职场文书
项目投资意向书范本
2015/05/09 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript