PHP获取一个文本文件最后 n 行内容

要求尽可能效率高,并可以跨平台使用。

答案

实现:

  1. function tail($file, $num)
  2. {
  3. $fp = fopen($file, "r");
  4. $pos = -2;
  5. $eof = "";
  6. $head = false; // 当总行数小于Num时,判断是否到第一行了
  7. $lines = array();
  8. while ($num > 0) {
  9. while ($eof != PHP_EOL) {
  10. if (fseek($fp, $pos, SEEK_END) == 0) { // fseek成功返回0,失败返回-1
  11. $eof = fgetc($fp);
  12. $pos--;
  13. } else { // 当到达第一行,行首时,设置$pos失败
  14. fseek($fp, 0, SEEK_SET);
  15. $head = true; // 到达文件头部,开关打开
  16. break;
  17. }
  18. }
  19. array_unshift($lines, str_replace(PHP_EOL, '', fgets($fp)));
  20. if ($head) { // 这一句,只能放上一句后,因为到文件头后,把第一行读取出来再跳出整个循环
  21. break;
  22. }
  23. $eof = "";
  24. $num--;
  25. }
  26. fclose($fp);
  27. return $lines;
  28. }