《PHP实例:PHP读取大文件的几种方法介绍》要点:
本文介绍了PHP实例:PHP读取大文件的几种方法介绍,希望对您有用。如果有疑问,可以联系我们。
读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位.
PHP实战
场景:PHP读取超大文件,例如1G的日志文件,我这里使用的是400M的access.log文件PHP实战
1、使用file直接读取
PHP实战
<?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
PHP实战
我的电脑是3G内存,此方法不是推荐使用,因为需要把文件全部载入内存PHP实战
2、使用linux命令 tail
PHP实战
<?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下使用PHP实战
3、使用fseek函数PHP实战
这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,因为PHP是C写的,所以实现的时候也类似C读取文件,通过指针的移动,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,PHP实战
下面是常用的几种方法
PHP实战
方法一:使用fopen打开文件(从文件指针资源句柄)
PHP实战
<?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.338493108749PHP实战
方法二:一块一块的读取PHP实战
<?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
PHP实战
使用fgets函数,一行一行读取PHP实战
<?php$file = fopen("testfile.txt","r"); while(!feof($file)) { echo fgets($file); } fclose($file);
spl库函数PHP实战
<?phptry{ foreach( new SplFileObject('testfile.txt') as $line) echo $line.'<br />';}catch (Exception $e){ echo $e->getMessage();}
另外网上有很多按照块读取文件的,有兴趣的读者可以试试,我试了没成功,好像必须含有换行符“n”才可以.PHP实战
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持维易PHP.PHP实战
转载请注明本页网址:
/jiaocheng/2938.html
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。