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连接Oracle for NT 远程数据库
Oct 09 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
深入解析php中的foreach函数
Aug 31 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
php自动加载autoload机制示例分享
Feb 20 PHP
PHP递归删除目录几个代码实例
Apr 21 PHP
php对象在内存中的存在形式分析
Feb 03 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
使用URL传输SESSION信息
Jul 14 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 PHP
Yii框架的布局文件实例分析
Sep 04 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给一组指定关键词添加span标签的方法
2015/03/31 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
python 布尔操作实现代码
2013/03/23 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python实现html转ubb代码(html2ubb)
2014/07/03 Python
神经网络python源码分享
2017/12/15 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
新西兰优惠网站:Treat Me
2019/07/04 全球购物
恶意软件的定义
2014/11/12 面试题
家具促销活动方案
2014/02/16 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
可怜妈妈观后感
2015/06/09 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang