您当前的位置: 首页 > 网站编程 > PHP教程 > PHP读取大文件的类SplFileObject使用介绍

PHP读取大文件的类SplFileObject使用介绍

作者:不详 来源:网络 发布时间: 2014-08-04 11:51 点击:
一般读取文件我们用fopen 或者 file_get_contents ,前者可以循环读取,后者可以一次性读取,但都是将文件内容一次性加载来操作。 如果加载的文件特别大时,如几百M,上G时,这时性能就降下来了,那么PHP里有没有对大文件的处理函数或者类呢? 答案是:有的。 PHP真的越

PHP读取大文件的类SplFileObject使用介绍

  一般读取文件我们用fopen 或者 file_get_contents ,前者可以循环读取,后者可以一次性读取,但都是将文件内容一次性加载来操作。

  如果加载的文件特别大时,如几百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读取大文件的类SplFileObject使用介绍"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4