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 和 XML: 使用expat函数(二)
Oct 09 PHP
PHP中文件上传的一个问题
Sep 04 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
Aug 07 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
简单谈谈php浮点数精确运算
Mar 10 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
Jun 04 PHP
php实现文章评论系统
Feb 18 PHP
针对PHP开发安全问题的相关总结
Mar 22 PHP
php写入txt乱码的解决方法
Sep 17 PHP
php输出形式实例整理
May 05 PHP
PHP程序守护进程化实现方法详解
Jul 16 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
ThinkPHP之N方法实例详解
2014/06/20 PHP
php中in_array函数用法分析
2014/11/15 PHP
php模板引擎技术简单实现
2016/03/15 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
[对联广告] JS脚本类
2006/08/27 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
python3简单实现微信爬虫
2015/04/09 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
python如何删除文件、目录
2020/06/23 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
商场总经理岗位职责
2014/02/03 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
CSS中实现动画效果-附案例
2022/02/28 HTML / CSS
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang