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

PHP 文字檔讀取效能實測:file_get_contents vs fread vs fgetc 差異百倍

     編輯:PHP 綜合知識

測試環境

  • 檔案大小:約 3 KB
  • 本地開發環境(SSD、PHP 7.4+)
  • 單次執行,非嚴格基準測試,僅供量級參考

三種讀取方式與耗時

方式程式碼耗時相對倍數
file_get_contentsfile_get_contents('shadow.xml');0.0003 秒1x(基準)
fread(一次讀完)$fp=fopen(...); fread($fp, 10000);0.0003 秒1x
fgetc 逐字元 + whilewhile(!feof($fp)) fgetc($fp);0.026 秒~87x

原因分析

  • file_get_contents 內部使用 mmap/read 系統呼叫一次性讀入核心緩衝區再拷貝到用戶空間,極少函數呼叫開銷。
  • fread 指定長度足夠大時同樣一次性讀完,效能相近。
  • fgetc 每次呼叫執行函數進入、檢查 EOF、複製單一字元、更新指標,**3 KB 需 ~3000 次呼叫**,函數呼叫開銷佔絕大多數。while 迴圈本身也增加指令數。

最佳實踐建議

  1. 小檔案(< 10 MB):直接用 file_get_contents(),簡潔高效。
  2. 大檔案/串流處理:用 fopen() + fread($fp, 8192) 分塊讀取,配合 Generator 逐行/逐塊處理,避免記憶體爆漲。
  3. 逐行處理:fgets($fp) 讀取一行(含換行),比 fgetc 快數百倍。
  4. CSV/結構化資料:fgetcsv() 直接解析欄位。
  5. 寫入:file_put_contents()(小檔)或 fwrite() 分塊(大檔)。

進階:SplFileObject 物件導向封裝

<?php
$file = new SplFileObject('large.csv');
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
    // $row 為陣列,已自動解析 CSV
}

優勢:可迭代、支援 seek()、current()、setCsvControl(),記憶體友善。

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