在管理大量本地文件(如軟件分發包、文檔、媒體資源等)時,確保文件完整性是非常關鍵的一個環節。一個有效的方式就是為每個文件生成其MD5 簽名,並將其存儲在一個數據庫中,以便後續進行校驗和變更檢測。 PHP 提供了一個非常方便的函數—— md5_file() ,它可以直接返回文件的MD5 校驗和。
本文將介紹如何使用md5_file()為本地文件生成簽名,並構建一個完整的文件校驗數據庫。
在開始之前,請確保你的服務器或開發環境中安裝了PHP,並且具有文件系統訪問權限。我們將以一個簡單的PHP 腳本為例,遞歸掃描某個目錄中的所有文件,生成它們的MD5 簽名並將其保存至數據庫中。
以下是一個完整的示例腳本,使用PDO 寫入SQLite 數據庫。你也可以根據需要替換為MySQL、PostgreSQL 等數據庫。
<?php
$directory = __DIR__ . '/files';
$dbFile = __DIR__ . '/checksum.db';
$pdo = new PDO('sqlite:' . $dbFile);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 初始化數據庫
$pdo->exec("CREATE TABLE IF NOT EXISTS file_checksums (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT UNIQUE,
md5 TEXT,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)");
// 掃描目錄並處理文件
function scanFiles($dir, $pdo) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($files as $file) {
if ($file->isFile()) {
$path = $file->getRealPath();
$md5 = md5_file($path);
$stmt = $pdo->prepare("INSERT INTO file_checksums (path, md5)
VALUES (:path, :md5)
ON CONFLICT(path) DO UPDATE SET md5 = :md5, updated_at = CURRENT_TIMESTAMP");
$stmt->execute([
':path' => $path,
':md5' => $md5,
]);
echo "已處理:$path\n";
}
}
}
scanFiles($directory, $pdo);
echo "文件簽名生成完成。\n";
之後你可以再運行一次該腳本,它會自動更新數據庫中已存在的文件記錄。你也可以創建一個獨立的校驗腳本,對比當前文件的MD5 與數據庫中記錄的MD5 值是否一致:
<?php
$directory = __DIR__ . '/files';
$dbFile = __DIR__ . '/checksum.db';
$pdo = new PDO('sqlite:' . $dbFile);
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($files as $file) {
if ($file->isFile()) {
$path = $file->getRealPath();
$currentMd5 = md5_file($path);
$stmt = $pdo->prepare("SELECT md5 FROM file_checksums WHERE path = :path");
$stmt->execute([':path' => $path]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row) {
if ($row['md5'] !== $currentMd5) {
echo "文件已被修改:$path\n";
}
} else {
echo "新文件:$path\n";
}
}
}
權限控制:確保文件和數據庫的讀寫權限正確配置。
定期運行:可以通過cron 定時任務定期運行簽名更新或校驗腳本。
遠程驗證:如果你需要遠程驗證文件完整性,可以將生成的簽名通過接口上傳到服務器(如<code> https://m66.net/api/upload_md5 </code>)。
通過md5_file()和數據庫存儲結合,你可以輕鬆構建一套高效且穩定的文件完整性校驗機制。這種方法適用於本地文件監控、系統安全審計、部署自動化等場景,有效提高了系統的可靠性和可追溯性。