PHP 讀取檔案內容常見有三種寫法:用反引號執行系統的 `cat` 指令、`fopen` 搭配 `fread`、或直接用 `file_get_contents`。這三種方式在小檔案和大檔案上的表現差異很大,實測數字比直覺猜測更有參考價值。
PHP 讀取檔案有哪三種常見寫法?
三種常見寫法分別是:透過反引號呼叫系統指令 `cat`、用 `fopen` 開檔後搭配 `fread` 讀取、以及直接呼叫 `file_get_contents`。三者都能拿到檔案內容,差別在底層實作方式——前者是另外開一個 shell process 去執行系統指令,後兩者則是 PHP 內建的檔案函式。
```php
// 方式一:反引號執行 shell 指令
$data = `cat /tmp/test.zip`;
// 方式二:fopen + fread
$fh = fopen('/tmp/test.zip', 'r');
$data = fread($fh, filesize('/tmp/test.zip'));
fclose($fh);
// 方式三:file_get_contents
$data = file_get_contents('/tmp/test.zip');
```
三種讀檔方式在大檔案上的速度差異有多大?
在一台運算速度偏慢的機器上處理 25MB 的檔案時,三種方式的耗時其實相差不多,反引號執行 `cat` 反而還略快一點。
| 讀取方式 | 25MB 檔案耗時 |
|---|---|
| 反引號 `` `cat` `` | 1.05 秒 |
| `fopen` + `fread` | 1.31 秒 |
| `file_get_contents` | 1.33 秒 |
差距落在幾百毫秒內,對大檔案來說不算明顯,可以視為三種方式效能相近。
三種讀檔方式在小檔案上的速度差異有多大?
換成一個 21KB 的純文字檔之後,情況完全反過來——反引號執行 `cat` 的耗時暴增,而 PHP 內建函式反而快上千百倍。
| 讀取方式 | 21KB 檔案耗時 |
|---|---|
| 反引號 `` `cat` `` | 1.98 秒 |
| `fopen` + `fread` | 0.00082 秒 |
| `file_get_contents` | 0.0069 秒 |
反引號執行 `cat` 讀 21KB 的小檔案居然比讀 25MB 的大檔案還慢,原因在於每次呼叫反引號都要另外開一個 shell process 去執行外部指令,這筆固定的 process 啟動成本跟檔案大小無關——檔案越小,這筆固定成本占的比例就越高,小檔案反而被拖累得最嚴重。
該用哪一種方式讀取 PHP 檔案?
除非有特殊理由要呼叫外部指令,否則應該直接用 PHP 內建的檔案函式——`fopen`+`fread` 或 `file_get_contents`——而不是透過反引號叫用 shell 的 `cat`。內建函式不需要額外開 process,不管檔案大小都能維持穩定的低耗時,尤其在需要讀取大量小檔案的情境下,反引號的固定開銷會被放大成明顯的效能問題。
`fopen`+`fread` 和 `file_get_contents` 兩者實測速度非常接近,選擇上可以依照程式碼風格決定:只需要一次讀完整個檔案內容,`file_get_contents` 寫法更精簡;需要更多控制(例如分段讀取、搭配其他檔案操作),則適合用 `fopen`+`fread`。
常見問題
為什麼反引號讀小檔案反而比讀大檔案慢?
因為反引號執行 `` `cat` `` 的主要成本是啟動一個外部 shell process,這筆成本是固定的,跟檔案內容大小無關。讀大檔案時,這筆固定成本被檔案本身的 I/O 時間稀釋掉;讀小檔案時,檔案 I/O 幾乎不花時間,固定的 process 啟動成本就顯得特別突出。
`fopen`+`fread` 和 `file_get_contents` 該選哪個?
兩者實測效能相近,沒有哪個明顯更快。單純讀完整份檔案內容,`file_get_contents` 一行就能完成,程式碼更簡潔;若需要搭配指標移動、分段讀取等更細緻的控制,則用 `fopen`+`fread` 比較合適。
參考資料
- PHP 官方文件,`file_get_contents` 函式說明,存取日期:2026-08-27。https://www.php.net/manual/en/function.file-get-contents.php
- PHP 官方文件,`fread` 函式說明,存取日期:2026-08-27。https://www.php.net/manual/en/function.fread.php
延伸閱讀
同樣屬於檔案系統操作,`fgets` 和 `fread` 之間也有行為上的差異,值得進一步比較:PHP fgets 和 fread 差異範例。
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2009-11-04
