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 $_SERVER详解
Jan 16 PHP
PHP 多进程 解决难题
Jun 22 PHP
Godaddy空间Zend Optimizer升级方法
May 10 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
PHP中类的自动加载的方法
Mar 17 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
PHP如何解决微信文章图片防盗链
Dec 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
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
python 堆和优先队列的使用详解
2019/03/05 Python
python解析yaml文件过程详解
2019/08/30 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
序列化Python对象的方法
2020/08/01 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
2014年大学生就业规划书
2014/04/04 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
应届毕业生自荐书
2014/06/18 职场文书
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS
JS实现简单九宫格抽奖
2022/06/28 Javascript