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 相关文章推荐
WINDOWS 2000下使用ISAPI方式安装PHP
Sep 05 PHP
Zend Guard一些常见问题解答
Sep 11 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
Oct 13 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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
初探PHP5
2006/10/09 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
动态加载js的几种方法
2006/10/23 Javascript
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python绘制多个曲线的折线图
2020/03/23 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
python线程信号量semaphore使用解析
2019/11/30 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
python 带时区的日期格式化操作
2020/10/23 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
自动化系在校本科生求职信
2013/10/23 职场文书
生产部主管岗位职责
2014/01/06 职场文书
高中军训广播稿
2014/01/14 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
高考升学宴答谢词
2015/01/20 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang