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 和 MySQL 开发的 8 个技巧
Oct 09 PHP
php 文件上传代码(限制jpg文件)
Jan 05 PHP
php 随机排序广告的实现代码
May 09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
PHP的5个安全措施小结
Jul 17 PHP
PHP Cookie的使用教程详解
Jun 03 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP simplexml_load_file()函数讲解
Feb 03 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 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实现的MySQL通用查询程序
2007/03/11 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
php限制文件下载速度的代码
2015/10/20 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
Mac 安装 nodejs方法(图文详细步骤)
2017/10/30 NodeJs
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python中动态检测编码chardet的使用教程
2017/07/06 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
幼儿教育感言
2014/02/05 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
陪护人员误工证明
2015/06/24 职场文书
新教师教学工作总结
2015/08/12 职场文书