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

PHP读取大文件的几种方法介绍

发表于: 2015-10-31   作者:互联网   来源:转载   浏览次数:
PHP
摘要:   读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位。     在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能 很
  读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位。
 

  在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。

需求:
有一个800M的日志文件,大约有500多万行, 用PHP返回最后几行的内容。


实现方法:


1. 直接采用file函数来操作
  由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,则内存使用量不受限制。


  下面是一段用file来取出这具文件最后一行的代码:

<?php

  ini_set('memory_limit', '-1');

  $file = 'access.log';

  $data = file($file);

  $line = $data[count($data) - 1];

  echo $line;

?>

  整个代码执行完成耗时 116.9613 (s)。
  我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万 不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了。


2.直接调用Linux的 tail 命令来显示最 后几行
  在Linux命令行下,可以直接使用 tail -n 10 access.log 很轻易的显示日志文件最后几行,可以直接用PHP来调用tail命令,执行PHP代码如下:

<?php

    $file = 'access.log';

    $file = escapeshellarg($file); // 对命令行参数进行安全转义

    $line = `tail -n 1 $file`;

    echo $line;

?>

  整个代码执行完成耗时 0.0034 (s)


3. 直接使用PHP的 fseek 来进行文件操作
  这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法:


方法一
  首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置, 再取这一行的位置,依次类推,直到找到了$num行。
#实现代码如下

<?php

$fp = fopen($file, "r");

$line = 10;

$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

?>

  整个代码执行完成耗时 0.0095 (s)


方法二
  还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换 行符(\n)的个数来判断是否已经读完最后$num行数据。
  #实现代码如下

<?php

$fp = fopen($file, "r");

$num = 10;

$chunk = 4096;

$fs = sprintf("%u", filesize($file));

$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);

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)

 {

  preg_match("!(.*?\n){" . ($num) . "}$!", $readData, $match);

  $data = $match[0];

  break;

 }

}

fclose($fp);

echo $data;

?>

  整个代码执行完成耗时 0.0009(s)。

 

方法三

<?php

function tail($fp, $n, $base = 5)

{

 assert($n > 0);

 $pos = $n + 1;

 $lines = array();

 while (count($lines) <= $n)

 {

  try

  {

   fseek($fp, -$pos, SEEK_END);

  }

  catch (Exception $e)

  {

   fseek(0);

   break;

  }

  $pos *= $base;

  while (!feof($fp))

  {

   array_unshift($lines, fgets($fp));

  }

 }

 return array_slice($lines, 0, $n);

}

var_dump(tail(fopen("access.log", "r+"), 10));

?>

  整个代码执行完成耗时 0.0003(s)

方法四,PHP的stream_get_line函数 ,读取快速,读取50万条数据大文件,大概需要20秒左右的时间!例子代码如下

$fp = fopen('./iis.log', 'r'); //文件 

while (!feof($fp)) { 

 //for($j=1;$j<=1000;$j++) {         //读取下面的1000行并存储到数组中 

  $logarray[] = stream_get_line($fp, 65535, "\n"); 

        // break;

  // } 

 

 }

 

PHP读取大文件的几种方法介绍

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,
系统中的所有线程都要访问系统资源,一个线程霸占某个资源,其他需要该资源的线程就不能完成自己的
一、问题出现 最近我发现之前做微信开发和普通的ionic可以用谷歌浏览器就调试了,但是如果添加了ng-
平时用$_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文件是一种
相信大家对于屏幕 截图(或称抓图)应该不会陌生,在Windows平台上,我们可以使用许多第三方的专业抓图
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号