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); }
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));
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.