PHP读取大文件的类SplFileObject使用介绍


Posted in PHP onApril 09, 2014

如果加载的文件特别大时,如几百M,上G时,这时性能就降下来了,那么PHP里有没有对大文件的处理函数或者类呢? 答案是:有的。
PHP真的越来越“面向对象”了,一些原有的基础的SPL方法都开始陆续地实现出class了。
从 PHP 5.1.0 开始,SPL 库增加了 SplFileObject 与 SplFileInfo 两个标准的文件操作类。SplFileInfo 是从 PHP 5.1.2 开始实现的。
从字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更为强大。
不错,SplFileInfo 仅用于获取文件的一些属性信息,如文件大小、文件访问时间、文件修改时间、后缀名等值,而 SplFileObject 是继承 SplFileInfo 这些功能的。
 

/** 返回文件从X行到Y行的内容(支持php5、php4)  
 * @param string $filename 文件名
 * @param int $startLine 开始的行数
 * @param int $endLine 结束的行数
 * @return string
 */
function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
    $content = array();
    $count = $endLine - $startLine;  
    // 判断php版本(因为要用到SplFileObject,PHP>=5.1.0)
    if(version_compare(PHP_VERSION, '5.1.0', '>=')){
        $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,''
}
   
Ps: 上面都没加”读取到末尾的判断”:!$fp->eof() 或者 !feof($fp),加上这个判断影响效率,自己加上测试很多很多很多行的运行时间就晓得了,而且这里加上也完全没必要。
从上面的函数就可以看出来使用SplFileObject比下面的fgets要快多了,特别是文件行数非常多、并且要取后面的内容的时候。fgets要两个循环才可以,并且要循环$endLine次。
此方法花了不少功夫,测试了很多中写法,就是想得出效率最高的方法。哪位觉得有值得改进的欢迎赐教。
使用,返回35270行-35280行的内容:
echo '<pre>';
var_dump(getFileLines('test.php',35270,35280));
echo '</pre>'; 
PHP 相关文章推荐
PHP脚本的10个技巧(1)
Oct 09 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
PHP 之 写时复制介绍(Copy On Write)
May 13 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
php动态添加url查询参数的方法
Apr 14 PHP
PHP导出Excel实例讲解
Jan 24 PHP
PHP中类的继承和用法实例分析
May 24 PHP
Yii2使用自带的UploadedFile实现的文件上传
Jun 20 PHP
php无法连接mysql数据库的正确解决方法
Jul 01 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
PHP实现权限管理功能示例
Sep 22 PHP
php解决约瑟夫环示例
Apr 09 #PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 #PHP
PHP父类调用子类方法的代码例子
Apr 09 #PHP
一个基于phpQuery的php通用采集类分享
Apr 09 #PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 #PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 #PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
Apr 08 #PHP
You might like
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
golang与PHP输出excel示例
2016/07/22 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
php面向对象重点知识分享
2019/09/27 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
python实现线程池的方法
2015/06/30 Python
Python装饰器用法示例小结
2018/02/11 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
税务专业毕业生自荐信
2013/11/10 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
考试作弊检讨书
2015/01/27 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python