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校验ISBN码的函数代码
Jan 17 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
PHP中使用smarty生成静态文件的例子
Apr 24 PHP
Linux下php5.4启动脚本
Aug 03 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
php中call_user_func函数使用注意事项
Nov 21 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
php远程请求CURL案例(爬虫、保存登录状态)
Apr 01 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
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
vue实现固定位置显示功能
2019/05/30 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python使用webbrowser浏览指定url的方法
2015/04/04 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
Python字符串的常见操作实例小结
2019/04/08 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Python内置函数property()如何使用
2020/09/01 Python
中科创达面试题
2016/12/28 面试题
Java程序员面试题
2013/07/15 面试题
专科应届生求职信
2013/11/24 职场文书
在校硕士自我鉴定
2014/01/23 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
工程承诺书怎么写
2014/05/24 职场文书
小学教育见习报告
2014/10/31 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
大国崛起日本观后感
2015/06/02 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js