站长网 PHP教程 php实现读取超大文件的办法

php实现读取超大文件的办法

这篇文章主要介绍了php实现读取超大文件的方法,需要的朋友可以参考下 通常来说在php读取大文件的时候,我们采用的方法一般是一行行来讲取,而不是一次性把文件全部写入内存中,这样会导致php程序卡死,下面就给大家介绍这样一个例子。 读取大文件最后几行数

  这篇文章主要介绍了php实现读取超大文件的方法,需要的朋友可以参考下
 
  通常来说在php读取大文件的时候,我们采用的方法一般是一行行来讲取,而不是一次性把文件全部写入内存中,这样会导致php程序卡死,下面就给大家介绍这样一个例子。
 
  读取大文件最后几行数据:
 
  <?php
  /**
   * 取文件最后$n行
   *  
   * @param string $filename 文件路径
   * @param int $n 最后几行
   * @return mixed false表示有错误,成功则返回字符串
   */
  function FileLastLines($filename, $n){
     if(!$fp = fopen($filename, 'r')){
      echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";
      return false;
      }
    $pos = -2;
    $eof = "";
    $str = "";
    while($n > 0){
      while($eof != "n"){
        if(!fseek($fp, $pos, SEEK_END)){
          $eof = fgetc($fp);
          $pos–;
          }else{
          break;
          }
        }
      $str .= fgets($fp);
      $eof = "";
      $n–;
      }
    return $str;
    }
   
  echo nl2br(FileLastLines('sss.txt', 4));
  /**
   * * * 取文件最后$n行 *
   *  
   * @param string $filename 文件路径 *
   * @param int $n 最后几行 *
   * @return mixed false表示有错误,成功则返回字符串
   */
  function FileLastLines($filename, $n){
    if(!$fp = fopen($filename, 'r')){
      echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";
      return false;
      }
    $pos = -2;
    $eof = "";
    $str = "";
    while($n > 0){
      while($eof != "n"){
        if(!fseek($fp, $pos, SEEK_END)){
          $eof = fgetc($fp);
          $pos–;
          }else{
          break;
          }
        }
      $str .= fgets($fp);
      $eof = "";
      $n–;
      }
    return $str;
    }
  echo nl2br(FileLastLines('sss . txt', 4));
   
  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));
  $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;
  ?>
  读者可以根据该实例特点加以改进和完善,使之更加符合自身应用需求。

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: pniu8212@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部