PHP读取大文件末尾N行的高效方法推荐

来源 https://m.jb51.net/article/85844.htm

PHP中通过fopen打开一个文件,指针位置是文件开头,也就是0,当你通过fgets或者fgetc是从当前指针位置向后读取指定长度的字符串,直到遇见换行符为止。

但是可以通过fseek()函数,将指针直接移动到末尾,并倒退N个位置,出现第一个换行符则为倒数第一行,再使用fgets将一整行都取出来即可。

这里面用到两个while循环,外层循环控制需要取得的行数,内层循环控制fseek动作。

函数如下:

<?php
 
/**
 * 取文件最后 $n 行
 * 来源 https://m.jb51.net/article/85844.htm
 * @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); // 直接这样操作会与原始文件行倒置
        $str1 = fgets($fp);
        $str = $str1 . $str;
        $eof = "";
        $n--;
    }
    return $str;
}
echo nl2br(FileLastLines('sss.txt', 4));
 

 

 

 

发表评论