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

5年以前  |  阅读数:795 次  |  编程语言:PHP 

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例