读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位。
场景:PHP读取超大文件,例如1G的日志文件,我这里使用的是400M的access.log文件
1、使用file直接读取
<?php $starttime=microtime_float(); ini_set('memory_limit', '-1'); $file = 'testfile.txt'; $data = file($file); $line = $data[count($data) - 1000]; $endtime=microtime_float(); echo count($data),"<br/>"; echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?>
运行结果:10127784 行 共使用了,7.8764359951s
我的电脑是3G内存,此方法不是推荐使用,因为需要把文件全部载入内存
2、使用linux命令 tail
<?php $starttime=microtime_float(); $file = 'testfile.txt'; $file = escapeshellarg($file); // 对命令行参数进行安全转义 $line = `tail -n 100 $file`; echo $line,"<br/>"; $endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } //end
运行结果:只使用了几毫秒、轻松搞定、这种方法不能在windows下使用
3、使用fseek函数
这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,因为PHP是C写的,所以实现的时候也类似C读取文件,通过指针的移动,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,
下面是常用的几种方法
方法一:使用fopen打开文件(从文件指针资源句柄)
<?php $starttime=microtime_float(); $file = 'testfile.txt'; $fp = fopen($file, "r+"); $line = 100; $pos = -2; $t =$data=""; while ($line > 0) { while ($t != "\n") //换行符 { fseek($fp, $pos, SEEK_END);//移动指针 $t = fgetc($fp);//获取一个字符 $pos--;//向前偏移 } $t = ""; $data = fgets($fp);//获取当前行的数据 $line--; } fclose($fp); echo $data,"<br/>"; $endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?>
运行结果:0.338493108749
方法二:一块一块的读取
<?php $starttime=microtime_float(); $file = 'testfile.txt'; $fp = fopen($file, "r"); $num = 10; $chunk = 4096;//4K的块 $fs = sprintf("%u", filesize($file)); $readData=''; $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : $fs; for($len = 0; $len < $max; $len += $chunk){ $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len; fseek($fp, ($len + $seekSize) * -1, SEEK_END); $readData = fread($fp, $seekSize) . $readData; if (substr_count($readData, "\n") >= $num + 1) { $ns=substr_count($readData, "\n")-$num+2; preg_match('/(.*?\n){'.$ns.'}/',$readData,$match); $data = $match[1]; break; } } fclose($fp); echo $data,"<br/>"; $endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?>
运行时间:0.00199198722839
使用fgets函数,一行一行读取
<?php $file = fopen("testfile.txt","r"); while(!feof($file)) { echo fgets($file); } fclose($file);
spl库函数
<?php try{ foreach( new SplFileObject('testfile.txt') as $line) echo $line.'<br />'; }catch (Exception $e){ echo $e->getMessage(); }
另外网上有很多按照块读取文件的,有兴趣的读者可以试试,我试了没成功,好像必须含有换行符“\n”才可以。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍php fseek函数读取大文件两种方法,包括了php fseek函数读取大文件两种方法的使用技巧和注意事项,需要的朋友参考一下 php读取大文件,使用fseek函数是最为普遍的方式,它不需要将文件的内容全部读入内存,而是直接通过指针来操作,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法. 方法一: 首先通过
本文向大家介绍php 使用file_get_contents读取大文件的方法,包括了php 使用file_get_contents读取大文件的方法的使用技巧和注意事项,需要的朋友参考一下 当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误,遇到这种情况我们可以使用PHP
本文向大家介绍PHP读取PPT文件的方法,包括了PHP读取PPT文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP读取PPT文件的方法。分享给大家供大家参考,具体如下: 最近做一个和FLASH有关的东西,其中就要用到在网站上看PPT就像百度,豆丁网那样可以直接在网站上读,在网上搜了半天没搜到,都是些什么安装个软件什么的,PHP网站放到空间上,谁能让你在哪装软件呢?不是在瞎扯么
本文向大家介绍Java中spring读取配置文件的几种方法示例,包括了Java中spring读取配置文件的几种方法示例的使用技巧和注意事项,需要的朋友参考一下 Spring读取配置XML文件分三步: 一.新建一个Java Bean: 二.构建一个配置文件bean_config.xml: 三.读取配置文件: 1.利用ClassPathXmlApplicationContext: ClassPathX
本文向大家介绍Java中的几种读取properties配置文件的方式,包括了Java中的几种读取properties配置文件的方式的使用技巧和注意事项,需要的朋友参考一下 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置: config.properties会经常存放一些系统常量,版本号,路径之类的 database.properties存放数据库的连接参数 l
本文向大家介绍python读取几个G的csv文件方法,包括了python读取几个G的csv文件方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇python读取几个G的csv文件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。