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

时间: 2024-10-10 07:06:07

PHP读取大文件的几种方法的相关文章

matlab读取cvs文件的几种方法

matlab读取CVS文件的几种方法: 1,实用csvread()函数 csvread()函数有三种使用方法: 1.M = csvread('filename')2.M = csvread('filename', row, col)3.M = csvread('filename', row, col, range) 第一种方法中,直接输入文件名,将数据读到矩阵M中.这里要求csv文件中只能包含数字. 第二种方法中,除了文件名,还指定了开始读取位置的行号(row)和列号(col).这里,行号.列号

[获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...

背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文件的行数的方法 $temp_file = 'error.log'; $fp = fopen($temp_file ,'r') or die("open file failure!"); $total_line = 0; if($fp){     /* 获取文件的一行内容,注意:需要php5

读取Excel文件的两种方法

第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(string fileName) { DataSet myDataSet = new DataSet(); //创建一个数据链接 string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + fileName +

java读取properties文件的几种方法

一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取 Java代码   Properties p=new Properties(); //p需要InputStream对象进行读取文件,而获取InputStream有多种方法: //1.通过绝对路径:InputStream is=new FileInputStream(filePath); //2.通过Class.getResourceAsStream(path)

java读取xml文件的三种方法

xml既简单又标准,值得拥有和学习,好多地方都用的到.假设有这么一个book.xml: <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Copyright w3school.com.cn --> <!-- W3School.com.cn bookstore example --> -<bookstore> -<book category="childre

PHP读取远程文件的4种方法

1. fopen, fread1 if($file = fopen("http://www.example.com/", "r")) {2 while(!feof ($file))3 $data .= fread($file, 1024);4 }5 fclose($file);2. file_get_contents很简单的一句话:$data = file_get_contents("http://www.example.com/");如果要限制

读取资源文件的几种方法

getResources().里有很多种方法,可以用有道翻译看下.我就不多说了,思路有很多种,每个人的习惯都不一样. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import android.app.Activi

Java读取xml文件的四种方法,及其取得配置文件的方法

xml文件: Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>河南省郑州市</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>河南省郑州市二七区</ADDR&g

Java读取xml文件的四种方法

xml文件: Xml代码 <?xml version="1.0" encoding="GB2312"?>   <RESULT>  <VALUE>  <NO>A1234</NO>  <ADDR>河南省郑州市</ADDR>  </VALUE>  <VALUE>  <NO>B1234</NO>  <ADDR>河南省郑州市二七区&l