How to read n lines at the end of a large file in php: first move the pointer to the end and go back 2 positions; then read a character through fgetc and make relevant judgments; finally use fgets directly to convert a character Just take out the entire row.
The operating environment of this article: windows7 system, PHP7.1 version, DELL G3 computer
php reads n lines at the end of a large file The efficient method
is shared with everyone below, and also serves as a reference for 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 the principle behind
while(!feof($fp)){ $data.=fgets($fp,4096); }
. That is, 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 functions are 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));
Recommended learning: "PHP Video Tutorial"
The above is the detailed content of Efficient way 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!