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 相关文章推荐
ftp类(example.php)
Oct 09 PHP
PHP 和 COM
Oct 09 PHP
用PHP生成静态HTML速度快类库
Mar 18 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
在PHP中使用redis
Nov 04 PHP
PHP中的替代语法介绍
Jan 09 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
Apr 17 PHP
php的闭包(Closure)匿名函数初探
Feb 14 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 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
PHP4引用文件语句的对比
2006/10/09 PHP
杏林同学录(五)
2006/10/09 PHP
php array_search() 函数使用
2010/04/13 PHP
PHP反射机制用法实例
2014/08/28 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
Python Selenium截图功能实现代码
2020/04/26 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
应用化学专业职业生涯规划书
2014/01/22 职场文书
美术社团活动总结
2014/06/27 职场文书
2014年督导工作总结
2014/11/19 职场文书
2014年环卫工作总结
2014/11/22 职场文书
2015入党自荐书范文
2015/03/05 职场文书
2015员工年度考核评语
2015/03/25 职场文书
爱国电影观后感
2015/06/19 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL