PHP 读取大文件的X行到Y行内容的实现代码


Posted in PHP onJune 24, 2013

需要读取一个文件的几行内容,但是文件比较大,所以研究了下php读取大文件的几行内容的方法,写了一个方法,代码如下(加了注释):
缓存文件如果能够保存在一行, 而利用算法读取指定的行数, 自然会比全部读出来挑选要快得多. 但php似乎这方面比较弱, 不太好操作. 就算使用SplFileObject仍然不是特别可取, 内存压力存在.

$fp->seek($startLine - 1);

经过测试, 此行代码在8MB文本中游走到最后一行, 内存占用为49KB, 还算不错. 换成fopen方式用fgets跳过的模式, 则花费29KB的内存, fopen还是占优势.

function getFileLines($filename, $startLine = 1, $endLine = 50, $method = 'rb'){ 
$content = array(); if (version_compare(PHP_VERSION, '5.1.0', '>=')) { // 判断php版本(因为要用到SplFileObject,PHP>=5.1.0) 
$count = $endLine - $startLine; 
$fp = new SplFileObject($filename, $method); 
$fp->seek($startLine - 1); // 转到第N行, seek方法参数从0开始计数 
for ($i = 0; $i <= $count; ++$i) { 
$content[] = $fp->current(); // current()获取当前行内容 
$fp->next(); // 下一行 
} 
} else { //PHP<5.1 
$fp = fopen($filename, $method); 
if (!$fp) 
return 'error:can not read file'; 
for ($i = 1; $i < $startLine; ++$i) { // 跳过前$startLine行 
fgets($fp); 
} 
for ($i; $i <= $endLine; ++$i) { 
$content[] = fgets($fp); // 读取文件行内容 
} 
fclose($fp); 
} 
return array_filter($content); // array_filter过滤:false,null,'' 
}

效果不错, SplFileObject类功能比较好.

PHP 相关文章推荐
php zlib压缩和解压缩swf文件的代码
Dec 30 PHP
PHP中的float类型使用说明
Jul 27 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
dedecms函数分享之获取某一栏目所有子栏目
May 19 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
给ECShop添加最新评论
Jan 07 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
php中使用GD库做验证码
Mar 31 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 #PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 #PHP
解析Ubuntu下crontab命令的用法
Jun 24 #PHP
关于crontab的使用详解
Jun 24 #PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
Jun 24 #PHP
关于Zend Studio 配色方案插件的介绍
Jun 24 #PHP
解析argc argv在php中的应用
Jun 24 #PHP
You might like
农民C键的运用技巧
2020/03/04 星际争霸
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
php实现的通用图片处理类
2015/03/24 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
php日期操作技巧小结
2016/06/25 PHP
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
2013/04/01 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
JSONP跨域请求
2017/03/02 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
python中Lambda表达式详解
2019/11/20 Python
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
新大陆软件面试题
2016/11/24 面试题
给导游的表扬信
2014/01/10 职场文书
《自选商场》教学反思
2014/02/14 职场文书
双创工作实施方案
2014/03/26 职场文书
设计大赛策划方案
2014/06/13 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
Python echarts实现数据可视化实例详解
2022/03/03 Python
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android