php fseek函数读取大文件两种方法

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

方法一:

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

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

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));

方法二 :

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

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

$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)

相关推荐

  • PHP使用fopen与file_get_contents读取文件实例分享

    php中读取文件可以使用fopen和file_get_contents这两个函数,二者之间没有本质区别,只是前者读取文件的php代码相比后者要复杂一点.本文章通过实例向大家讲解fopen和file_get_contents读取文件的实现代码.需要的码农可以参考一下. fopen读取文件的代码如下: <?php $file_name = "1.txt"; echo $file_name . " "; $fp = fopen($file_name, 'r'); /

  • PHP file_get_contents 函数超时的几种解决方法

    这里就简单介绍两种: 一.增加超时的时间限制 这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间. 我一开始以为set_time_limit也能影响到file_get_contents,后来经测试,是无效的.真正的修改file_get_contents延时可以用resource $context的timeout参数: 复制代码 代码如下: $opts = array( 'http'=>array( 'met

  • PHP $_FILES函数详解

    如: 复制代码 代码如下: <form enctype="multipart/form-data" action="upload.php" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="1000"> <input name="myFile" type=&qu

  • php file_put_contents()功能函数(集成了fopen、fwrite、fclose)

    命令:file_put_contents(): 命令解析:file_put_contents (PHP 5) file_put_contents -- 将一个字符串写入文件 说明: int file_put_contents ( string filename, string data [, int flags [, resource context]] ) 和依次调用 fopen(),fwrite() 以及 fclose() 功能一样. 参数 data 可以是数组(但不能为多维数组),这就相当

  • PHP移动文件指针ftell()、fseek()、rewind()函数总结

    在对文件进行读写过程中,有时需要在文件中跳转.同不同位置读取,以及将数据写入到不同的位置.例如,使用文件模拟数据库保存数据,就需要移动文件指针.指针的位置是以从文件头开始的字节数度量的,默认以不同模式打开文件时,文件指针通常在文件的开头或是结尾处,可以通过ftell().fseek()和rewind()三个函数对文件指针进行操作,它们的原型如下所示: 复制代码 代码如下: int ftell(resource handle)         //返回文件指针的当前位置 int fseek(res

  • PHP file_get_contents函数读取远程数据超时的解决方法

    在网络状况比较差的情况下file_get_contents函数经常读取远程数据失败. 解决办法如下: 复制代码 代码如下: /*设置超时配合失败之后尝试多次读取,效果比原先好很多*/ $url = 'http://www.jb51.net';           $opts = array(            'http'=>array(           'method'=>"GET",           'timeout'=>1, //设置超时   )  

  • php使用file函数、fseek函数读取大文件效率对比分析

    php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接采用file函数来操作 由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,

  • php 使用file_get_contents读取大文件的方法

    当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误,遇到这种情况我们可以使用PHP的文件读取函数file_get_contents()进行分段读取. 函数说明 string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset

  • PHP读取大文件的类SplFileObject使用介绍

    如果加载的文件特别大时,如几百M,上G时,这时性能就降下来了,那么PHP里有没有对大文件的处理函数或者类呢? 答案是:有的.PHP真的越来越"面向对象"了,一些原有的基础的SPL方法都开始陆续地实现出class了.从 PHP 5.1.0 开始,SPL 库增加了 SplFileObject 与 SplFileInfo 两个标准的文件操作类.SplFileInfo 是从 PHP 5.1.2 开始实现的.从字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更

  • php读取本地文件常用函数(fopen与file_get_contents)

    下面我们以.txt文件为实例来介绍php读取本地文件的函数,读取文件我们可以利用fopen或file_get_contents来读取,file_get_contents更简单而fopen需要fread配合才可以显示读出的内容. 1.首先来介绍一下fopen()函数 下面我们给出了一个直接打开本地文件的代码demo,必要的地方我们都已经加上了注释: 复制代码 代码如下: //直接打开一个本地文件的实例代码       <?php       //假若我们本地的文件是一个名为xmlas.txt的文本

随机推荐