在 PHP 開發中,讀取大型文件的最後一行是常見需求。若直接將整個文件載入記憶體會造成效能負擔,因此採用檔案指標移動的方式更為高效。本文介紹一種透過 fseek() 從檔案末尾向前逐字元讀取,直到遇到換行符為止的實作技巧。
$rs = 'README.md';
$fp = fopen($rs, 'r');
fseek($fp, -1, SEEK_END);
$s = '';
while (($c = fgetc($fp)) !== false) {
if ($c == "\n" && $s) break;
$s = $c . $s;
fseek($fp, -2, SEEK_CUR);
}
fclose($fp);
echo $s;
exit;
\n 且 $s 不為空時,表示已完整讀取最後一行,跳出迴圈。此方法適合處理大型日誌、CSV 或純文字檔,避免 file() 或 file_get_contents() 造成記憶體溢位。需注意:若檔案以 Windows 風格換行(\r\n),判斷條件應調整為 $c == "\n" 仍可運作,因 \r 會被包含在 $s 中;若檔案無尾隨換行符,首次判斷 $s 為空不會中斷,能正確讀取最後一行。