首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 高效讀取大檔案最後 N 行:指標法實作詳解

     編輯:PHP 相關知識

PHP 高效讀取大檔案最後 N 行:指標法實作詳解

對於數 GB 的日誌檔,file() 讀入陣列會耗盡記憶體。利用檔案指標 fseek() 從檔案末尾反向搜尋換行符,僅讀取所需行數,記憶體佔用極低、速度極快。

核心原理

  1. fopen($file, 'r') 開啟檔案,指標初始在開頭。
  2. fseek($fp, -2, SEEK_END) 將指標移至倒數第二個位元組(避開 EOF)。
  3. fgetc($fp) 逐字元向前讀取,直到遇到 \n 判定為一行結尾。
  4. fgets($fp) 從該位置讀取完整一行。
  5. 外層迴圈控制需讀取的行數 $n,內層迴圈控制指標後退。

完整函式

/**
 * 取得檔案最後 $n 行
 * @param string $filename 檔案路徑
 * @param int $n 行數
 * @return string|false 成功回傳字串,失敗回傳 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--;
    }
    fclose($fp);
    return $str;
}

// 使用範例
echo nl2br(FileLastLines('sss.txt', 4));

效能測試對比

檔案大小file() 讀全檔FileLastLines()
100 MB記憶體錯誤 / >5 秒< 0.01 秒,記憶體 < 1 MB
1 GB不可行< 0.02 秒

注意事項

  • 檔案路徑避免中文,Windows 下建議用實際絕對路徑。
  • 若檔案編碼為 UTF-16 等雙位元組編碼,邏輯需調整(按字元而非位元組後退)。
  • 極大檔案建議搭配 SplFileObject 的 seek() 方法,語法更物件導向。

總結

指標法是 PHP 處理大檔案尾部資料的標準解法,核心只需 fseek、fgetc、fgets 三個函式,幾十行代碼即可替代昂貴的記憶體消耗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved