文件讀取三步驟
- 打開:
fopen($file, $mode)
- 讀取:多種函數按需選擇
- 關閉:
fclose($handle)
核心讀取函數對比表
| 函數 | 讀取單位 | 特點 | 適用場景 |
fgets($fp, $len) | 行 | 讀至換行/EOF/$len-1 字節,返回字串 | 逐行處理文本、日誌分析 |
fgetss($fp, $len, $tags) | 行 | 同 fgets + 去除 PHP/HTML 標籤,$tags 保留允許標籤 | 安全讀取用戶生成內容 |
fgetcsv($fp, $len, $delim, $enc) | 行 | 解析 CSV 字段(處理引號/轉義),返回陣列 | CSV/TSV 結構化數據導入 |
fgetc($fp) | 字符 | 單字符讀取,效率極低 | 極少用,教學/特殊解析 |
readfile($file) | 全文件 | 直接輸出到輸出緩衝區,返回字節數 | 圖片/文件下載、靜態資源透傳 |
fpassthru($fp) | 剩餘內容 | 從當前指針輸出至 EOF,返回字節數 | 大文件分塊下載、斷點續傳 |
file($file) | 全文件 | 返回行陣列,含換行符 | 小文件全量加載、配置解析 |
fread($fp, $len) | 字節 | 讀指定字節數,二進制安全 | 固定長度記錄、二進制協議解析 |
實戰代碼集錦
1. 安全逐行讀取(去除標籤)
$fp = fopen('user_input.txt', 'r');
while (!feof($fp)) {
$line = fgetss($fp, 1024, '<b><i><u>'); // 只保留基礎格式標籤
echo $line;
}
fclose($fp);
2. CSV 高效導入
$fp = fopen('data.csv', 'r');
while (($row = fgetcsv($fp, 0, ',', '"')) !== false) {
// $row 為字段陣列,自動處理引號包裹、逗號轉義
User::create([
'name' => $row[0],
'email' => $row[1],
'phone' => $row[2],
]);
}
fclose($fp);
3. 大文件下載(節省內存)
$file = 'large_video.mp4';
if (!file_exists($file)) { http_response_code(404); exit; }
header('Content-Type: video/mp4');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
$fp = fopen($file, 'rb');
fpassthru($fp); // 直接輸出,不佔用 PHP 內存
fclose($fp);
4. 二進制固定長度讀取
$fp = fopen('binary.dat', 'rb');
while (!feof($fp)) {
$record = fread($fp, 32); // 每條記錄 32 字節
if (strlen($record) !== 32) break;
// unpack 解析二進制結構
$data = unpack('Nid/nage/Csex/a10name', $record);
process($data);
}
fclose($fp);
輔助函數組合拳
filesize($file):獲取文件大小,配合 fread($fp, filesize($file)) 全量讀取
file_exists($file):讀取前檢查,避免不必要的錯誤處理
is_readable($file):權限預檢
feof($fp):判斷指針是否達 EOF,**注意**:僅在讀取操作後調用才可靠
常見坑點避雷
| 坑點 | 正確姿勢 |
fgetcsv 參數順序錯誤 | 順序:handle, length, delimiter, enclosure, escape |
readfile 直接輸出無法捕獲內容 | 需輸出緩衝區控制或改用 file_get_contents |
大文件用 file() 導致 OOM | 改用流式讀取 fgets/fread |
忘記 fclose 洩露文件句柄 | 用 try/finally 或 fclose 確保釋放 |
二進制文件未用 b 模式 | Windows 下必須 fopen($file, 'rb') |
現代化替代:SplFileObject
參考 SplFileObject 實戰指南,提供 OO 介面、自動資源管理、CSV 旗標、定位迭代等優勢,**新項目優先選用**。