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 相关文章推荐
PHP5+UTF8多文件上传类
Oct 17 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHPExcel内存泄漏问题解决方法
Jan 23 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP XML和数组互相转换详解
Oct 26 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 PHP
PHP chop()函数讲解
Feb 11 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 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 session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
php cookie 详解使用实例
2016/11/03 PHP
破解Session cookie的方法
2006/07/28 Javascript
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
详解python之简单主机批量管理工具
2017/01/27 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
以太网Ethernet IEEE802.3
2013/08/05 面试题
职称自我鉴定
2013/10/15 职场文书
物流专业毕业生推荐信范文
2013/11/18 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
培训讲师岗位职责
2014/04/13 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
护林员个人总结
2015/03/04 职场文书
公司职员入党自传书
2015/06/26 职场文书
小学教代会开幕词
2016/03/04 职场文书
Nginx配置之禁止指定IP访问
2022/05/02 Servers
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL