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 相关文章推荐
ajax+php打造进度条代码[readyState各状态说明]
Apr 12 PHP
PHP下常用正则表达式整理
Oct 26 PHP
php Ubb代码编辑器函数代码
Jul 05 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
php去掉文件前几行的方法
Jul 29 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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预定义变量使用帮助(带实例)
2013/10/30 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
JavaScript的Function详细
2006/11/14 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
对python PLT中的image和skimage处理图片方法详解
2019/01/10 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Python socket聊天脚本代码实例
2020/01/02 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
优秀辅导员事迹材料
2014/02/16 职场文书
市场调查策划方案
2014/06/10 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
离职信范文
2015/06/23 职场文书