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 相关文章推荐
第五节--克隆
Nov 16 PHP
php文本转图片自动换行的方法
Mar 13 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
PHP分页类集锦
Nov 18 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
php传值赋值和传地址赋值用法实例分析
Jun 20 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 PHP
php实现根据身份证获取精准年龄
Feb 26 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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
用Socket发送电子邮件
2006/10/09 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
python实现文本文件合并
2015/12/29 Python
Python正则表达式经典入门教程
2017/05/22 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
Python是如何进行类型转换的
2013/06/09 面试题
MYSQL支持事务吗
2013/08/09 面试题
单位法人授权委托书范本
2014/10/09 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python
Redis全局ID生成器的实现
2022/06/05 Redis
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS