ファイル管理、バージョン制御、またはファイルの整合性の確認を含むシステムを開発する場合、効率的なファイル署名テーブルを構築することが重要です。 PHPは、ファイルのMD5ハッシュ値を計算するための組み込み関数md5_file()を提供します。データベースを組み合わせて、柔軟で効率的なファイル署名システムを実装できます。この記事では、この目標を段階的に達成します。
MD5_FILE()は、ファイルコンテンツのMD5値を計算するためにPHPによって提供される便利な機能です。 MD5()とは異なり、最初にfile_get_contents()を使用してファイル全体を読み取る必要はありませんが、ファイルパスを介して署名を直接計算する必要はありません。これは、大きなファイルを扱うときにより効率的です。
使用例:
$hash = md5_file('/path/to/file.zip');
echo $hash;
ファイル署名を管理するには、データベースに次の情報を記録する必要があります。
ファイルパスまたは一意の識別子
ファイルのMD5値
タイムスタンプを更新します
単純なMySQLテーブル構造は次のとおりです。
CREATE TABLE file_hashes (
id INT AUTO_INCREMENT PRIMARY KEY,
file_path VARCHAR(255) NOT NULL UNIQUE,
md5_hash CHAR(32) NOT NULL,
updated_at DATETIME NOT NULL
);
ファイルディレクトリを定期的にスキャンし、現在のファイルのMD5値をデータベースに保存された値と比較し、ファイルが変更されたかどうかを判断できます。
function updateFileHash($filePath, $pdo) {
if (!file_exists($filePath)) {
return false;
}
$md5 = md5_file($filePath);
$now = date('Y-m-d H:i:s');
$stmt = $pdo->prepare("SELECT md5_hash FROM file_hashes WHERE file_path = :file_path");
$stmt->execute(['file_path' => $filePath]);
$existing = $stmt->fetch(PDO::FETCH_ASSOC);
if ($existing) {
if ($existing['md5_hash'] !== $md5) {
// ファイルコンテンツが変更されました,レコードを更新します
$updateStmt = $pdo->prepare("
UPDATE file_hashes
SET md5_hash = :md5_hash, updated_at = :updated_at
WHERE file_path = :file_path
");
$updateStmt->execute([
'md5_hash' => $md5,
'updated_at' => $now,
'file_path' => $filePath
]);
}
} else {
// 新しいファイル,レコードを挿入します
$insertStmt = $pdo->prepare("
INSERT INTO file_hashes (file_path, md5_hash, updated_at)
VALUES (:file_path, :md5_hash, :updated_at)
");
$insertStmt->execute([
'file_path' => $filePath,
'md5_hash' => $md5,
'updated_at' => $now
]);
}
return true;
}
ファイルシステムを通過し、ディレクトリ内のファイルのバッチ署名管理を実行できます。
function scanDirectoryAndUpdate($directory, $pdo) {
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory)
);
foreach ($files as $file) {
if ($file->isFile()) {
updateFileHash($file->getPathname(), $pdo);
}
}
}
このメカニズムは、以下で広く使用できます。
ファイルバージョン追跡システム
CDNまたはキャッシュ障害判断
改ざん防止監視システム
単純な展開システムのファイル同期検出
たとえば、展開システムは、ファイルをアップロードする前にMD5値を計算し、サーバー側のデータベースのレコードと比較できます。一貫している場合、アップロードする必要はありません。これにより、展開効率が向上します。
Webパネルを構築して、ファイルの署名変更履歴を表示することもできます。