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 相关文章推荐
php字符串截取问题
Nov 28 PHP
php 函数使用方法与函数定义方法
May 09 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
PHP求小于1000的所有水仙花数的代码
Jan 10 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
常见php数据文件缓存类汇总
Dec 05 PHP
整理php防注入和XSS攻击通用过滤
Sep 13 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 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 不使用js实现页面跳转
2014/02/11 PHP
php网页病毒清除类
2014/12/08 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
js+css实现打字效果
2020/06/24 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
在django中使用自定义标签实现分页功能
2017/07/04 Python
python距离测量的方法
2018/03/06 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
python sorted函数的小练习及解答
2019/09/18 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
班长岗位职责
2013/11/10 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
Python 匹配文本并在其上一行追加文本
2022/05/11 Python