PHP 读取大文件与读取一般的文件是有些区别的,如果你的文件到了几百MB或GB这样可能普通的php读取文件会很慢或卡死了,下面我来介绍一下PHP 读取大文件技巧吧。

一般读取文件我们用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

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 '';

var_dump(getFileLines('test.php',35270,35280));

echo '';

再看一个实例

代码如下

复制代码

function readBigFile($filename, $count = 20, $tag = "rn") {

$content = "";//最终内容

$current = "";//当前读取内容寄存

$step= 1;//每次走多少字符

$tagLen = strlen($tag);

$start = 0;//起始位置

$i = 0;//计数器

$handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件起始位置

while($i < $count && !feof($handle)) {

fseek($handle, $start, SEEK_SET);//指针设置在文件开头

$current = fread($handle,$step);//读取文件

$content .= $current;//组合字符串

$start += $step;//依据步长向前移动

//依据分隔符的长度截取字符串最后免得几个字符

$substrTag = substr($content, -$tagLen);

if ($substrTag == $tag) { //判断是否为判断是否是换行或其他分隔符

$i++;

$content .= "

";

}

}

//关闭文件

fclose($handle);

//返回结果

return $content;

}

$filename = "csdn.sql";//需要读取的文件

$tag = "n";//行分隔符 注意这里必须用双引号

$count = 100;//读取行数

$data = readBigFile($filename,$count,$tag);

echo $data;

注意:通过使用PHP的fseek和fread相结合,即可做到随意读取文件中的某一部份数据,关于函数传入的变量$tag的值,根据系统不一样,传入的值也是有区别的:Windows用”rn”,linux/unix用”n”,Mac OS用”r”。

php读程序,PHP 读取大文件程序代码相关推荐

  1. 计算机考试中画图不能处理的格式,解决画图程序无法读取该文件。无效的位图文件或不支持文件的格式的方法...

    画图是每一个windows系统中都有的程序,虽然这个程序一直没有添加很多新的功能,但是基础功能已经够我们日常使用了.很多图片需要添加文字或是截取大小的时候我们经常会使用画图功能来进行操作.最近有位朋友 ...

  2. python读文件代码-简单了解Python读取大文件代码实例

    这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...

  3. php -- 读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  4. Java高效读取大文件

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础"系列教程的一部分. ...

  5. php中读取大文件实现方法详解

    php中读取大文件实现方法详解 来源:   时间:2013-09-05 19:27:01   阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...

  6. PHP几个快速读取大文件例子

    PHP几个快速读取大文件例子 感谢 把我给崩了 的投递 时间:2014-10-16 来源:三联 在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents ...

  7. Java高效读取大文件(转)

    Java高效读取大文件 1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础&quo ...

  8. PHP如何快速读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  9. python读取大文件的某行_python 大文件以行为单位读取方式比对

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...

最新文章

  1. linux 基础学习入门 2
  2. ssl初一组周六模拟赛【2018.3.31】
  3. MSDN Magazine推出Custom Report Item示例ProgressTracker CRI
  4. centos snmp配置_Cacti1.2.16最新版安装和配置(Shell一键安装)
  5. python三大编程语言_程序员最需要的三种编程语言
  6. Lucene于搜索引擎技术(Analysis包详解)
  7. GNU cflow实现调用关系分析
  8. html图片右上角关闭按钮,jQuery UI:datepicker – 如何在右上角添加关闭按钮(图像!)?...
  9. hdoj--5620--KK's Steel(斐波那契数)
  10. 20200728每日一句
  11. matlab-画折线图
  12. Windows10 查看电脑关机时间(提交忘记打卡申请必备)
  13. 快速排序的C语言实现
  14. 清北学堂noip2018集训D2
  15. 支付宝-生成二维码实现url,实现支付
  16. 站点(e.g. Hexo Blog)提交百度搜索引擎收录实现SEO
  17. 2022 世界人工智能大会,都讲了些啥?
  18. linux远程win7无法连接wifi,苹果电脑win7系统连不上wifi热点深度纯净
  19. 1. Python环境搭建
  20. Go 语言高质量编程

热门文章

  1. 少侠请重新来过 - Vue学习笔记(二) - Vue生命周期
  2. Cocos Creator中的动画支持技术
  3. MATLAB 人脸定位
  4. android初学之退出应用程序
  5. 查看域名真实IP地址NSlookup命令使用浅析
  6. YUMI~~强大的USB启动盘制作工具!!
  7. 如何利用css使PNG图片透明
  8. goroutine sync.Mutex互斥锁Lock的使用
  9. docker离线包相关脚本编写示例:docker镜像load/push/save脚本
  10. Scala 类中声明方法