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中其实也可以用方法链
Nov 10 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
PHP exif扩展方法开启详解
Jul 28 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
Oct 13 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
Jan 09 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
php实现将二维关联数组转换成字符串的方法详解
Jul 31 PHP
搭建自己的PHP MVC框架详解
Aug 16 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 PHP
PHP实现抽奖功能实例代码
Jun 30 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
php在window iis的莫名问题的测试方法
2013/05/14 PHP
php实现水仙花数示例分享
2014/04/03 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
JQuery优缺点分析说明
2011/04/10 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
Python读取Excel的方法实例分析
2015/07/11 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
pandas取出重复数据的方法
2019/07/04 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
人事主管的岗位职责
2013/11/16 职场文书
高中生期末评语大全
2014/01/28 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
数控机床专业自荐信
2014/05/19 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
详解Go语言中Get/Post请求测试
2022/06/01 Golang