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 相关文章推荐
实用函数5
Nov 08 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
在PHP中使用redis
Nov 04 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
php用户登录之cookie信息安全分析
May 13 PHP
PHP入门教程之图像处理技巧分析
Sep 11 PHP
php版微信js-sdk支付接口类用法示例
Oct 12 PHP
WAF的正确bypass
Jan 05 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
PHP实现搜索时记住状态的方法示例
May 11 PHP
php利用array_search与array_column实现二维数组查找
Jul 08 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初学者头痛的十四个问题
2006/07/12 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
使用正则替换变量
2007/05/05 Javascript
js对象的比较
2011/02/26 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
web打印小结
2017/01/11 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
玩转python爬虫之cookie使用方法
2016/02/17 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
django rest framework 自定义返回方式
2020/07/12 Python
解决c++调用python中文乱码问题
2020/07/29 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
Unix/Linux开发面试题
2016/08/16 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
家长对孩子的感言
2014/03/10 职场文书
商铺租赁意向书
2014/04/01 职场文书
遗嘱继承公证书
2014/04/09 职场文书
户籍证明书标准模板
2014/09/10 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记