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 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
IP138 IP地址查询小偷实现代码
Feb 15 PHP
提高PHP编程效率的53个要点(经验小结)
Sep 04 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
php有道翻译api调用方法实例
Dec 22 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
浅析PHP7新功能及语法变化总结
Jun 17 PHP
PHP数据库处理封装类实例
Dec 24 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP常用函数之base64图片上传功能详解
Oct 21 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 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的autoload机制的实现解析
2012/09/15 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
详解vue中组件参数
2018/07/09 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
Python2随机数列生成器简单实例
2017/09/04 Python
python实现ID3决策树算法
2017/12/20 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
医院检讨书范文
2014/02/01 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
小学少先队活动总结
2015/05/08 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
班主任班级管理心得体会
2016/01/07 职场文书