現在の位置: ホーム> 最新記事一覧> md5_file()とデータベースを使用してファイル署名テーブルを管理します

md5_file()とデータベースを使用してファイル署名テーブルを管理します

M66 2025-06-05

ファイル管理、バージョン制御、またはファイルの整合性の確認を含むシステムを開発する場合、効率的なファイル署名テーブルを構築することが重要です。 PHPは、ファイルのMD5ハッシュ値を計算するための組み込み関数md5_file()を提供します。データベースを組み合わせて、柔軟で効率的なファイル署名システムを実装できます。この記事では、この目標を段階的に達成します。

1.なぜmd5_file()を選択するのか

MD5_FILE()は、ファイルコンテンツのMD5値を計算するためにPHPによって提供される便利な機能です。 MD5()とは異なり、最初にfile_get_contents()を使用してファイル全体を読み取る必要はありませんが、ファイルパスを介して署名を直接計算する必要はありません。これは、大きなファイルを扱うときにより効率的です。

使用例:

 $hash = md5_file('/path/to/file.zip');
echo $hash;

2。データベース構造設計

ファイル署名を管理するには、データベースに次の情報を記録する必要があります。

  • ファイルパスまたは一意の識別子

  • ファイルの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
);

3.ファイル署名の更新と検証ロジックを実装します

ファイルディレクトリを定期的にスキャンし、現在のファイルの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;
}

4.ディレクトリのバッチスキャンと署名テーブルを更新します

ファイルシステムを通過し、ディレクトリ内のファイルのバッチ署名管理を実行できます。

 function scanDirectoryAndUpdate($directory, $pdo) {
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($directory)
    );

    foreach ($files as $file) {
        if ($file->isFile()) {
            updateFileHash($file->getPathname(), $pdo);
        }
    }
}

V.典型的なアプリケーションシナリオ

このメカニズムは、以下で広く使用できます。

  • ファイルバージョン追跡システム

  • CDNまたはキャッシュ障害判断

  • 改ざん防止監視システム

  • 単純な展開システムのファイル同期検出

たとえば、展開システムは、ファイルをアップロードする前にMD5値を計算し、サーバー側のデータベースのレコードと比較できます。一貫している場合、アップロードする必要はありません。これにより、展開効率が向上します。

Webパネルを構築して、ファイルの署名変更履歴を表示することもできます。