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的ob_start();控制您的浏览器cache!
Nov 25 PHP
MYSQL环境变量设置方法
Jan 15 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 PHP
10个php函数实用却不常见
Oct 13 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
详解python单元测试框架unittest
2018/07/02 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
python实现简单飞行棋
2020/02/06 Python
最新的互联网创业计划书
2014/01/10 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
项目申请汇报材料
2014/08/16 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
酒店前台辞职书
2015/02/26 职场文书
工作会议通知
2015/04/15 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
Golang生成Excel文档的方法步骤
2021/06/09 Golang
python 字典和列表嵌套用法详解
2021/06/29 Python
Python实现照片卡通化
2021/12/06 Python