Recommended efficient method for reading N lines at the end of a large file in PHP, _PHP tutorial

WBOY
Release: 2016-07-12 08:51:08
Original
724 people have browsed it

Recommended efficient methods for reading N lines at the end of large files in PHP.

Small files within a few megabytes can be read into an array line by line through the file() function. , and then use array_pop to get the last row.

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.

A file pointer needs to be used here. Those who have studied C should know what a pointer is. To put it simply, in PHP, a file is opened through fopen. At this time, the file has not been read. At this time, it points to the beginning of the file. , the pointer position is 0. When you read content from a file through fgets or fgetc, the pointer will advance accordingly as you read. This is also

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

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 to go back one position again. Judgment, until we go back to the ending 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));
Copy after login

The above recommendation for an efficient method for reading N lines at the end of a large file in PHP is all the content shared by the editor. I hope it can give you a reference, and I hope you will support Bangkejia more.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1133021.htmlTechArticleRecommended efficient method for PHP to read the N lines at the end of a large file. Small files within a few megabytes can be passed through file () function, read the file into an array line by line, and use array_pop to get the last line, just...
Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template