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 adodb分页实现代码
Mar 19 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
php输入数据统一类实例
Feb 23 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
php生成酷炫的四个字符验证码
Apr 22 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
php+js实现裁剪任意形状图片
Oct 31 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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
golang与PHP输出excel示例
2016/07/22 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
php生成微信红包数组的方法
2019/09/05 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
简单介绍Python中的struct模块
2015/04/28 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
Python学习思维导图(必看篇)
2017/06/26 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
pandas删除指定行详解
2019/04/04 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
大学生如何写自荐信
2014/01/08 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
新年主持词
2014/03/27 职场文书
2019银行竞聘书
2019/06/21 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python