| 方式 | 程式碼 | 耗時 | 相對倍數 |
|---|---|---|---|
file_get_contents | file_get_contents('shadow.xml'); | 0.0003 秒 | 1x(基準) |
fread(一次讀完) | $fp=fopen(...); fread($fp, 10000); | 0.0003 秒 | 1x |
fgetc 逐字元 + while | while(!feof($fp)) fgetc($fp); | 0.026 秒 | ~87x |
file_get_contents 內部使用 mmap/read 系統呼叫一次性讀入核心緩衝區再拷貝到用戶空間,極少函數呼叫開銷。fread 指定長度足夠大時同樣一次性讀完,效能相近。fgetc 每次呼叫執行函數進入、檢查 EOF、複製單一字元、更新指標,**3 KB 需 ~3000 次呼叫**,函數呼叫開銷佔絕大多數。while 迴圈本身也增加指令數。file_get_contents(),簡潔高效。fopen() + fread($fp, 8192) 分塊讀取,配合 Generator 逐行/逐塊處理,避免記憶體爆漲。fgets($fp) 讀取一行(含換行),比 fgetc 快數百倍。fgetcsv() 直接解析欄位。file_put_contents()(小檔)或 fwrite() 分塊(大檔)。<?php
$file = new SplFileObject('large.csv');
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
// $row 為陣列,已自動解析 CSV
}
優勢:可迭代、支援 seek()、current()、setCsvControl(),記憶體友善。