1. 程式人生 > >php讀取超大檔案最後幾行

php讀取超大檔案最後幾行

大檔案只能用fread()一行行讀,直接file()會記憶體不足,php.ini memory_limit預設是128m記憶體

<?php
/**
 * 取檔案最後$n行
 * @param string $file 檔案路徑
 * @param int $line 最後幾行
 * @return mixed 成功則返回字串
 */
function getLastLines($file,$line=1){
	if(!$fp=fopen($file,'r')){
        echo "開啟檔案失敗";
        return false;
    }
	$pos = -2;		//偏移量
	$eof = " ";		//行尾標識
	$data = "";
	while ($line > 0){//逐行遍歷
		while ($eof != "\n"){ //不是行尾
			fseek($fp, $pos, SEEK_END);//fseek成功返回0,失敗返回-1  
			$eof = fgetc($fp);//讀取一個字元並賦給行尾標識
			$pos--;//向前偏移
		}
		$eof = " ";
		$data .= fgets($fp);//讀取一行	
		$line--;
	}
	fclose($fp);
	return $data;
}


//測試
print_r(getLastLines("access.log",5));exit; 

如果是linux伺服器,還可以使用tail來進行

<?php
function getLastLines($file,$line=1){
	$file = escapeshellarg($file); // 對命令列引數進行安全轉義
	$line = `tail -n $line $file`;
	return $line;
}
//測試
print_r(getLastLines("down.php",5));exit;