當前位置: 首頁> 最新文章列表> 為什麼md5_file() 返回的是FALSE?

為什麼md5_file() 返回的是FALSE?

M66 2025-06-03

在PHP 中, md5_file()是一個非常實用的函數,用於計算一個文件的MD5 散列值。它的基本語法如下:

 md5_file(string $filename, bool $binary = false): string|false

這個函數接受一個文件路徑作為參數,返回該文件的MD5 校驗和(默認為十六進制格式的字符串)。然而,許多開發者在使用md5_file()時會遇到返回FALSE的情況,這往往代表某些錯誤發生了。本文將從多個角度分析可能導致這種情況的原因。

1. 文件路徑錯誤

這是最常見的原因之一。如果提供的文件路徑有誤,無論是拼寫錯誤、路徑格式錯誤,還是路徑中包含了不存在的目錄, md5_file()都會失敗並返回FALSE

示例:

 $hash = md5_file('/path/to/nonexistent/file.txt');

此處,如果file.txt並不存在,或者路徑拼寫錯誤,就會返回FALSE

2. 文件權限不足

即使文件路徑正確,如果PHP 腳本所在的運行用戶(通常是Web 服務器用戶,如www-data )沒有讀取目標文件的權限,也會導致md5_file()返回FALSE

解決方法:

你可以通過更改文件權限或所屬用戶來確保PHP 有足夠權限讀取該文件。

 chmod 644 /path/to/file.txt
chown www-data:www-data /path/to/file.txt

3. 文件正在被其他進程鎖定

某些操作系統和文件系統在文件被寫入或被其他程序鎖定時,會限制其他程序讀取該文件。這種情況下,如果md5_file()嘗試讀取該文件,也可能返回FALSE

示例:

比如,正在被FTP 上傳或另一個腳本寫入的文件,PHP 可能會遇到讀取失敗的問題。

4. 使用了URL 而不是本地路徑

PHP 的md5_file()從理論上支持通過allow_url_fopen設置開啟後,使用URL 作為參數。但實際上,這種方式容易出錯,尤其是遠程服務器返回錯誤狀態碼或內容較大、緩慢時。

示例:

 $hash = md5_file('https://m66.net/uploads/example.zip');

這段代碼只有在allow_url_fopen設置為On的情況下才可能成功運行。否則,將返回FALSE

你可以在代碼中使用如下方式確認配置:

 if (!ini_get('allow_url_fopen')) {
    echo "遠程文件訪問功能未開啟";
}

建議:避免依賴遠程URL,先通過file_get_contents()下載到本地臨時文件再使用md5_file()會更穩妥。

5. 文件為空或損壞

md5_file()雖然可以處理空文件,但有時候,如果文件被截斷或損壞(尤其是二進製文件),可能會造成讀取異常。這種情況不常見,但可以通過filesize()fopen() + fread()手動檢測文件狀態。

6. 路徑中含有特殊字符或編碼不一致

當文件路徑中包含非UTF-8 字符(尤其是在Windows 系統上)或路徑是由用戶上傳時構造的(例如中文、空格或特殊符號),路徑可能被錯誤解析。

示例:

 $hash = md5_file('/var/www/uploads/文件A.txt'); // 路徑編碼可能不一致

使用realpath()來規避這類問題是一個好方法:

 $path = realpath('/var/www/uploads/文件A.txt');
$hash = md5_file($path);

7. 臨時文件已經被刪除或移動

在使用move_uploaded_file()tmpfile() 、或某些自動生成的臨時路徑文件時,這些文件在運行中可能被刪除、移動或超出生命週期,導致md5_file()在嘗試讀取時失敗。