文件處理是 PHP 核心能力之一。本文系統梳理 is_* 判斷函數、file* 屬性獲取、basename/dirname/pathinfo 路徑解析、創建刪除修改、多種讀寫模式(file_get_contents/fopen)、文件鎖、指針控制 (fseek/ftell/rewind) 等完整知識體系。
| 函數 | 用途 |
|---|---|
is_dir | 是否目錄 |
is_file | 是否普通文件 |
is_readable | 可讀 |
is_writable | 可寫 |
is_executable | 可執行 |
is_link | 符號鏈接 |
is_uploaded_file | HTTP POST 上傳文件 |
$file = 'example.txt';
echo "存在: " . (file_exists($file) ? '是' : '否') . "\n";
echo "大小: " . filesize($file) . " bytes\n";
echo "類型: " . filetype($file) . "\n"; // file/dir/link
echo "修改時間: " . date('Y-m-d H:i:s', filemtime($file)) . "\n";
echo "訪問時間: " . date('Y-m-d H:i:s', fileatime($file)) . "\n";
echo "權限: " . substr(sprintf('%o', fileperms($file)), -4) . "\n"; // 如 0644
echo "所有者 UID: " . fileowner($file) . "\n";
echo "Inode: " . fileinode($file) . "\n";
$path = "/var/www/html/index.php";
echo basename($path); // index.php
echo dirname($path); // /var/www/html
print_r(pathinfo($path));
/* Array
(
[dirname] => /var/www/html
[basename] => index.php
[extension] => php
[filename] => index
) */
touch('new.txt'); // 創建空文件/更新時間
unlink('old.txt'); // 刪除文件
rename('a.txt', 'b.txt'); // 重命名/移動
copy('src.txt', 'dst.txt'); // 複製
chmod('script.sh', 0755); // 設置權限 (八進制)
| 模式 | 說明 | 指針位置 | 文件不存在 | 文件存在 |
|---|---|---|---|---|
| r | 只讀 | 開頭 | 失敗 | 保留內容 |
| r+ | 讀寫 | 開頭 | 失敗 | 保留內容,覆蓋寫入 |
| w | 只寫 | 開頭 | 創建 | **清空**內容 |
| w+ | 讀寫 | 開頭 | 創建 | **清空**內容 |
| a | 只寫(追加) | 結尾 | 創建 | 保留,追加寫入 |
| a+ | 讀寫(追加) | 結尾 | 創建 | 保留,追加寫入 |
| b | 二進制模式 (Windows 必需) | 配合上述字母使用,如 rb wb | ||
| t | 文本模式 (Windows 換行轉換) | 配合使用,如 rt | ||
file_get_contents($file):一次性讀全文,適合小文件/遠程 URL。file_put_contents($file, $data, FILE_APPEND):一次性寫入,FILE_APPEND 追加模式。file($file):按行讀入數組,含換行符。fopen/fread/fwrite/fgets/fgetc:流式控制,適合大文件/精確指針操作。$fp = fopen('data.bin', 'rb');
echo ftell($fp); // 0
fread($fp, 10); // 讀 10 字節
echo ftell($fp); // 10
fseek($fp, 20, SEEK_CUR); // 相對當前 +20
fseek($fp, -10, SEEK_END); // 相對文件末尾 -10
rewind($fp); // 回到開頭
fclose($fp);
$fp = fopen('counter.txt', 'c+'); // 打開/創建,指針在開頭
if (flock($fp, LOCK_EX)) { // 獨占鎖
$count = (int)fread($fp, 100) + 1;
ftruncate($fp, 0); // 清空
rewind($fp);
fwrite($fp, $count);
flock($fp, LOCK_UN); // 釋放鎖
}
fclose($fp);
fopen/fread,禁用 file_get_contents。flock,或遷移至 Redis/數據庫原子操作。DIRECTORY_SEPARATOR 或統一正斜杠 /。is_uploaded_file + move_uploaded_file + MIME/副檔名白名單。sys_get_temp_dir() + tempnam(),定期清理。文件系統 API 看似基礎,實則是構建緩存、日誌、上傳、導出、ETL 等核心功能的基石,值得深度掌握。