当前位置:首页 > PHP教程 > php文件操作 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-26 11:39:47 浏览: 评论:0 

这篇文章主要介绍了php实现读取超大文件的方法,需要的朋友可以参考下

通常来说在php读取大文件的时候,我们采用的方法一般是一行行来讲取,而不是一次性把文件全部写入内存中,这样会导致php程序卡死,下面就给大家介绍这样一个例子。

读取大文件最后几行数据:

  1. <?php 
  2. /** 
  3.  * 取文件最后$n行 
  4.  *  
  5.  * @param string $filename 文件路径 
  6.  * @param int $n 最后几行 
  7.  * @return mixed false表示有错误,成功则返回字符串 
  8.  */ 
  9. function FileLastLines($filename$n){ 
  10.    if(!$fp = fopen($filename'r')){ 
  11.     echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文"
  12.     return false; 
  13.     } 
  14.   $pos = -2; 
  15.   $eof = ""
  16.   $str = ""
  17.   while($n > 0){ 
  18.     while($eof != "n"){ 
  19.       if(!fseek($fp$pos, SEEK_END)){ 
  20.         $eof = fgetc($fp); 
  21.         $pos–; 
  22.         }else
  23.         break
  24.         } 
  25.       } 
  26.     $str .= fgets($fp); 
  27.     $eof = ""
  28.     $n–; 
  29.     } 
  30.   return $str
  31.   } 
  32.  
  33. echo nl2br(FileLastLines('sss.txt', 4)); 
  34. /** 
  35.  * * * 取文件最后$n行 * 
  36.  *  
  37.  * @param string $filename 文件路径 * 
  38.  * @param int $n 最后几行 * 
  39.  * @return mixed false表示有错误,成功则返回字符串 
  40.  */ 
  41. function FileLastLines($filename$n){ 
  42.   if(!$fp = fopen($filename'r')){ 
  43.     echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文"
  44.     return false; 
  45.     } 
  46.   $pos = -2; 
  47.   $eof = ""
  48.   $str = ""
  49.   while($n > 0){ 
  50.     while($eof != "n"){ 
  51.       if(!fseek($fp$pos, SEEK_END)){ 
  52.         $eof = fgetc($fp); 
  53.         $pos--; 
  54.         }else
  55.         break
  56.         } 
  57.       } 
  58.     $str .= fgets($fp); 
  59.     $eof = ""
  60.     $n--; 
  61.     } 
  62.   return $str
  63.   } 
  64. echo nl2br(FileLastLines('sss . txt', 4)); 
  65.  
  66. function tail($fp$n$base = 5) 
  67.   assert($n > 0); 
  68.   $pos = $n + 1; 
  69.   $lines = array(); 
  70.   while(count($lines) < = $n){ 
  71.     try{ 
  72.       fseek($fp, - $pos, SEEK_END); 
  73.       } 
  74.     catch (Exception $e){ 
  75.       fseek(0); 
  76.       break
  77.       } 
  78.     $pos *= $base
  79.     while(!feof($fp)){ 
  80.       array_unshift($linesfgets($fp)); 
  81.       } 
  82.     } 
  83.   return array_slice($lines, 0, $n); 
  84.   } 
  85. var_dump(tail(fopen("access.log""r+"), 10)); 
  86. $fp = fopen($file"r"); 
  87. $line = 10; 
  88. $pos = -2; 
  89. $t = " "
  90. $data = ""
  91. while ($line > 0){ 
  92.   while ($t != "n"){ 
  93.     fseek($fp$pos, SEEK_END); 
  94.     $t = fgetc($fp); 
  95.     $pos --; 
  96.     } 
  97.   $t = " "
  98.   $data .= fgets($fp); 
  99.   $line --; 
  100.   } 
  101. fclose ($fp); 
  102. echo $data
  103. ?> 

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

Tags: php读取超大文件

分享到: