Home  >  Article  >  Backend Development  >  How to read N lines at the end of a large file in PHP

How to read N lines at the end of a large file in PHP

墨辰丷
墨辰丷Original
2018-06-02 09:12:471442browse

This article mainly introduces the method of reading the N lines at the end of a large file in PHP. Interested friends can refer to it. I hope it will be helpful to everyone.

For small files within a few megabytes, you can use the file() function to read the file into an array line by line, and then use array_pop to get the last line.

But for very large text files, the machine memory is not large enough, or PHP itself has a memory_limit limit, so this method is not applicable. Even if there is no limit, the efficiency is very low.

Is there no other way? Of course there is, but there is no ready-made function, so you need to do it yourself.

You need to use the file pointer here. Those who have studied C should know what pointers are. To put it simply, in PHP, a file is opened through fopen. At this time, the file has not been read. At this time, the pointer pointed to It is the beginning of the file, and the pointer position is 0. When you read content from the file through fgets or fgetc, the pointer will advance accordingly as you read. This is also

while(!feof($fp)){
$data.=fgets($fp,4096);
}


The principle of implementation is that fgets reads a string of specified length backward from the current pointer position until a newline character is encountered.

So is it possible to control the position of the pointer to the Nth line from the bottom? Unfortunately, no, but you can move the pointer directly to the end and back N positions through the fseek() function.

We first move the pointer to the end, and go back 2 positions, read a character through fgetc, and determine whether the character is "\n", which is a newline character. If it is not a newline character, then continue Go back one position and judge again until we go back to the end newline character of the previous line. Just use fgets to take out the entire line. Two while loops are used here. The outer loop controls the number of rows to be obtained, and the inner loop controls the fseek action.

The function is as follows:

/**
 * 取文件最后$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));

Summary: The above is the entire content of this article , I hope it can be helpful to everyone’s study.

Related recommendations:

Summary of PHP implementation of obtaining the parent directory of the current file

php Detailed explanation of WeChat red envelope random generation algorithm

phpThree methods to implement non-buffered query API

The above is the detailed content of How to read N lines at the end of a large file in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn