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

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

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