当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

PHP读取大文件的几种方法

发表于: 2015-06-02   作者:互联网   来源:转载   浏览次数:
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[

场景: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

PHP读取大文件的几种方法

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,
平时用$_post[''],$_get['']获取表单中参数时会出现Notice: Undefined index: --------; 虽然可以
读取图片有两种方法: 绝对路径法和相对路径法 1、绝对路径法:需要将图片的路径完完整整的写到网页
XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许
XML文件是一种经常使用的文件格式,比如WinForm里面的app.config以及Web程序中的web.config文件,还
XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许
本文转载:http://www.cnblogs.com/xiaoxiangfeizi/archive/2011/07/29/2120807.html XML文件是一种
页面静态化的方法,分为两种,一种是伪静态,就是url 重写,一种是你真的静态化。下面介绍PHP中页面
我们在做第三方应用开发时经常会用到Linq来定向的解析查询所得到的XML文件,本文是自己在做WP7第三
读取文件大小:1.45G 第一种,OldIO: (注意文件和系统编码) public static void oldIOReadFile()
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号