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安装攻略:常见问题解答(一)
Oct 09 PHP
删除及到期域名的查看(抢域名必备哦)
May 14 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
php绘制圆形的方法
Jan 24 PHP
PHP读取大文件的多种方法介绍
Apr 04 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
PHP7中I/O模型内核剖析详解
Apr 14 PHP
php设计模式之策略模式应用案例详解
Jun 17 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
3种平台下安装php4经验点滴
2006/10/09 PHP
PHP实现图片简单上传
2006/10/09 PHP
如何隐藏你的.php文件
2007/01/04 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
python实现发送邮件及附件功能
2021/03/02 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
简单了解python反射机制的一些知识
2019/07/13 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
岗位职责的定义
2013/11/10 职场文书
质量月活动策划方案
2014/03/10 职场文书
活动总结格式范文
2014/04/26 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android