<?php
$filePath = '/Users/Cuffica/Desktop/addicted.rtf'; // 替換為實際路徑
// 1. 以只讀模式打開文件,返回資源句柄
$fp = fopen($filePath, 'r');
if ($fp === false) {
die("無法打開文件:{$filePath}");
}
// 2. 循環讀取:feof() 檢測指針是否到達文件末尾
while (!feof($fp)) {
// fgetc() 參數是「句柄」而非文件名,每次讀取 1 個字符
$char = fgetc($fp);
if ($char !== false) {
echo $char;
}
}
// 3. 關閉句柄釋放資源
fclose($fp);
?>
| 函數 | 說明 |
|---|---|
fopen(path, 'r') | 打開文件,返回資源句柄;'r' 為只讀模式,指針指向開頭。 |
feof(handle) | 檢查文件指針是否在 EOF(End Of File)位置,到達末尾返回 true。 |
fgetc(handle) | 從句柄讀取**單個字符**(含換行符),指針後移 1 位;失敗或 EOF 返回 false。 |
fclose(handle) | 關閉文件句柄,**務必調用**,否則佔用系統文件描述符導致洩漏。 |
fgetc 按位元組讀取。若文件為 UTF-8 中文(每字 3 位元組),直接輸出會導致亂碼。建議改用 fgets() 按行讀取,或讀取整體內容後用 mb_convert_encoding 處理。file_get_contents() — 小文件一次性讀入記憶體fgets() / fread() — 大文件分塊/按行讀取SplFileObject — 面向對象封裝,支援迭代器模式逐行處理fopen 返回值;生產環境建議包裝 try-catch 或設置錯誤處理器。'rb',輸出前發送正確 Content-Type 標頭。<?php
$fp = fopen('huge.log', 'rb');
if ($fp) {
while (!feof($fp)) {
$chunk = fread($fp, 8192); // 每次讀 8KB
if ($chunk === false) break;
// 處理 $chunk,如寫入另一文件、解析日志、發送網絡流等
process_chunk($chunk);
}
fclose($fp);
}
?>
while(!feof($fp)) { fgetc($fp); } 是 PHP 文件讀取最基礎的教學範例,理解「句柄、指針、EOF」三大概念至關重要。實際開發中,請根據文件大小、編碼、處理邏輯選擇更高層級的 API(file()、SplFileObject、流過濾器等),寫出更健壯、高效的代碼。