首页 > 开发 > PHP > 正文

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

2024-05-04 23:24:38
字体:
来源:转载
供稿:网友
这篇文章主要介绍了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;?>

读者可以根据该实例特点加以改进和完善,使之更加符合自身应用需求。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表