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与MySQL开发的8个技巧小结
Dec 17 PHP
ajax php传递和接收变量实现思路及代码
Dec 19 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
在win7中搭建Linux+PHP 开发环境
Oct 08 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
PHP常用工具类大全附全部代码下载
Dec 07 PHP
php上传图片类及用法示例
May 11 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
php 的反射详解及示例代码
2016/08/25 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
初识Javascript小结
2015/07/16 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
Python复数属性和方法运算操作示例
2017/07/21 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
python实现银行实战系统
2020/02/26 Python
python中字典增加和删除使用方法
2020/09/30 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
京剧自荐信
2014/01/26 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
个人自荐材料
2014/05/23 职场文书
关于旅游的活动方案
2014/08/15 职场文书
毕业实习计划书
2015/01/16 职场文书
2015年外联部工作总结
2015/04/03 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书