PHP高性能读取文件的两种方法

313 阅读1分钟

第一种:利用fseek函数

//参数传入文件路径$file和读取行数$lines(末尾倒数)
function read_file($file, $lines)
{
    $handle = fopen($file, "r+");
    $linecounter = $lines;
    //$pos = cache('pos'.$file);
    if(empty($pos)){
        $pos = -2;
    }
    $beginning = false;
    $text = array();
    while ($linecounter > 0) {
        $t = " ";
        while ($t != "\n") {
            if(fseek($handle, $pos, SEEK_END) == -1) {
                $beginning = true; break;
            }
            $t = fgetc($handle);
            $pos --;
        }
        $linecounter --;
        if($beginning) rewind($handle);
        $text[$lines-$linecounter-1] = fgets($handle);
        if($beginning) break;
    }
    //cache('pos'.$file,$pos);
    fclose ($handle);
    return array_reverse($text);
}

第二种:利用linux命令行函数tail

    function tail_log($filename,$n)
    {
        $err_msg = "对应日志文件不存在!";
        if(!file_exists($filename)){
            throw new Exception($err_msg);
        }
        $cmd = <<<EOF
tail -n $n $filename
EOF;
        //安全转义
        $cmd = escapeshellcmd($cmd);
        try{
            @exec($cmd,$res);
        }catch (\Exception $e){
             return $e->getMessage();
        }
        return $res;
    }