php读取大文件最好的实现方法

php读取大文件方法我们一般是一行行来讲取而不是一次性把文件全部写入内存中了,这样会导致php程序卡死,下面给大家整理一个例子.

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

  1. /**
  2. * 取文件最后$n行
  3. * @param string $filename 文件路径
  4. * @param int $n 最后几行
  5. * @return mixed false表示有错误,成功则返回字符串
  6. */
  7. function FileLastLines($filename,$n){
  8. if(!$fp=fopen($filename,’r')){
  9. echo ”打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文”;
  10. return false;
  11. }
  12. $pos=-2;
  13. $eof=”";
  14. $str=”";
  15. while($n>0){
  16. while($eof!=”n”){
  17. if(!fseek($fp,$pos,SEEK_END)){
  18. $eof=fgetc($fp);
  19. $pos–;
  20. }else{
  21. break;
  22. }
  23. }
  24. $str.=fgets($fp);
  25. $eof=”";
  26. $n–;
  27. }
  28. return $str;
  29. }
  30. echo nl2br(FileLastLines(‘sss.txt’,4));
  31. /** * 取文件最后$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));
  32. //开源软件:phpfensi.com
  33. function tail($fp,$n,$base=5)
  34. {
  35. assert($n>0);
  36. $pos = $n+1;
  37. $lines = array();
  38. while(count($lines)< =$n){
  39. try{
  40. fseek($fp,-$pos,SEEK_END);
  41. } catch (Exception $e){
  42. fseek(0);
  43. break;
  44. }
  45. $pos *= $base;
  46. while(!feof($fp)){
  47. array_unshift($lines,fgets($fp));
  48. }
  49. }
  50. return array_slice($lines,0,$n);
  51. }
  52. var_dump(tail(fopen("access.log","r+"),10));
  53. $fp = fopen($file, "r");
  54. $line = 10;
  55. $pos = -2;
  56. $t = " ";
  57. $data = "";
  58. while ($line > 0) {
  59. while ($t != "n") {
  60. fseek($fp, $pos, SEEK_END);
  61. $t = fgetc($fp);
  62. $pos --;
  63. }
  64. $t = " ";
  65. $data .= fgets($fp);
  66. $line --;
  67. }
  68. fclose ($fp);
  69. echo $data