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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
php桌面中心(四) 数据显示
Mar 11 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
php 目录与文件处理-郑阿奇(续)
Jul 04 PHP
php连接mssql数据库的几种方法
Feb 21 PHP
php格式化日期实例分析
Nov 12 PHP
PHP信号量基本用法实例详解
Feb 12 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
Mar 06 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
docker-compose部署php项目实例详解
Jul 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
实例讲解PHP表单
2020/06/10 PHP
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
使用Python对Excel进行读写操作
2017/03/30 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
Python for循环生成列表的实例
2018/06/15 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
基于Python实现用户管理系统
2019/02/26 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
汽车检测与维修专业求职信
2013/10/30 职场文书
迎接领导欢迎词
2014/01/11 职场文书
高三政治教学反思
2014/02/06 职场文书
运动会加油口号
2014/06/07 职场文书
低碳环保口号
2014/06/12 职场文书
街道社区活动报告
2015/02/05 职场文书
大学生党员个人总结
2015/02/13 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
CSS3实现指纹特效代码
2022/03/17 HTML / CSS