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多种序列化与反序列化的方法
Jun 06 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
Jun 20 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
php使用json_encode对变量json编码
Apr 07 PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 PHP
php获取远程文件大小
Oct 20 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
May 09 PHP
PHP7多线程搭建教程
Apr 21 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
php使用scandir()函数扫描指定目录下所有文件示例
Jun 08 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 echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python实现银行管理系统
2019/10/25 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
2020/02/23 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
幼儿园校车司机的岗位职责
2014/01/30 职场文书
会计电算化大学生职业规划书
2014/02/05 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
销售员岗位职责
2014/06/09 职场文书
单位在职证明书
2014/09/11 职场文书
教师读书笔记
2015/06/29 职场文书
小学班长竞选稿
2015/11/20 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
python manim实现排序算法动画示例
2022/08/14 Python