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

PHP 文件讀取操作全攻略:fgets/fgetcsv/readfile/fpassthru 實戰詳解

     編輯:PHP 綜合知識

文件讀取三步驟

  1. 打開:fopen($file, $mode)
  2. 讀取:多種函數按需選擇
  3. 關閉: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 旗標、定位迭代等優勢,**新項目優先選用**。

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