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

PHP unlink 刪除文件失效排查:BOM 頭、路徑解析與存在性檢查全解析

     編輯:PHP 相關知識

unlink() 刪除文件失敗,報 No such file or directory,往往不是權限問題,而是「隱形字符」或路徑解析差異導致。本文系統梳理排查思路。

典型錯誤信號

Warning: unlink(user_logo/d4d84f383714d5f3.jpg) ... No such file or directory

關鍵線索: 是 UTF-8 BOM (Byte Order Mark) 的 HTML 實體編碼,說明文件名讀取時攜帶了不可見的 BOM 字符 \xEF\xBB\xBF。

三大根因與解決

  1. 數據庫存儲帶 BOM:CSV/Excel 導入、編輯器保存時未去除 BOM。
    修復:入庫前 $filename = preg_replace('/^\xEF\xBB\xBF/', '', $filename); 或 ltrim($filename, "\xEF\xBB\xBF")。
  2. 相對/絕對路徑混淆:腳本執行目錄 (CWD) 與預期不一致。
    修復:統一用絕對路徑 __DIR__ . '/user_logo/' . $filename。
  3. 文件實際不存在:已被刪除、路徑拼寫錯誤、大小寫敏感(Linux)。
    修復:刪除前必加 if (file_exists($path)) unlink($path);。

防禦性編程模板

function safeUnlink($relativePath, $baseDir = __DIR__) {
    $fullPath = $baseDir . '/' . ltrim($relativePath, '/');
    $fullPath = preg_replace('/^\xEF\xBB\xBF/', '', $fullPath); // 去 BOM
    
    if (file_exists($fullPath) && is_file($fullPath)) {
        if (@unlink($fullPath)) {
            return ['success' => true, 'path' => $fullPath];
        }
        return ['success' => false, 'error' => 'unlink_failed', 'path' => $fullPath];
    }
    return ['success' => false, 'error' => 'not_found', 'path' => $fullPath];
}

調試技巧

  • var_dump(bin2hex($filename)) 可見隱藏字符十六進制。
  • realpath($path) 驗證路徑解析結果。
  • 檢查 open_basedir 限制是否阻斷訪問。

「文件不存在」背後往往藏著編碼、路徑、上下文三類陷阱,逐層驗證方能根治。

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