実際の開発では、特に多数のファイルを保存する場合、ファイル重複排除は一般的な要件です。複製ファイルを回避すると、スペースを節約するだけでなく、システムの効率が向上します。 PHPは非常に便利な機能MD5_FILE()を提供します。これにより、ファイルのハッシュ計算をすばやく実装して、ファイルが複製されているかどうかを簡単に判断できます。
MD5_FILE()は、指定されたファイルコンテンツのMD5ハッシュ値を計算するためのPHPの組み込み関数です。基本的な構文は次のとおりです。
string md5_file(string $filename, bool $raw_output = false)
$ filename :計算するファイルパス。
$ raw_output :rawバイナリ形式で出力するかどうかにかかわらず、デフォルトはfalse 、32ビットの16進数文字列を返します。
この関数は、ファイルの内容の一意の要約を返します。これは、2つのファイルの内容が同じかどうかを判断するのに非常に適しています。
アイデアは非常にシンプルです:
ターゲットフォルダー内のすべてのファイルを繰り返します。
md5_file()を使用して、各ファイルのハッシュ値を計算します。
配列を使用して、表示されたハッシュ値を記録します。
ファイルのハッシュ値が既に存在する場合、それは複製ファイルであると判断され、削除またはスキップすることを選択できます。
これがサンプルコードです:
<?php
$directory = '/path/to/your/files'; // ファイルディレクトリ
$hashes = []; // ファイルのハッシュ値を保存するために使用されます
// ディレクトリ内のすべてのファイルをトラバースします
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($files as $file) {
if ($file->isFile()) {
$filePath = $file->getRealPath();
$fileHash = md5_file($filePath); // ファイルを計算しますMD5
if (isset($hashes[$fileHash])) {
// 重複ファイルを見つけます,処理を実行します,たとえば、削除します
echo "ファイルの複製: {$filePath} 已存在ファイルの複製 {$hashes[$fileHash]}\n";
// unlink($filePath); // 削除する必要がある場合,このラインの概要
} else {
// 新しいハッシュを記録します
$hashes[$fileHash] = $filePath;
}
}
}
?>
バッチ処理:多くの大きなディレクトリファイルがある場合、一度に大量のメモリを消費しないようにバッチでスキャンできます。
キャッシュハッシュ:一般的に使用されるディレクトリの場合、ハッシュの結果はデータベースまたはファイルにキャッシュして、次回効率を改善するために直接読み取ることができます。
交換アルゴリズム:MD5は非常に効率的ですが、セキュリティが弱い。セキュリティ要件が高い場合は、 sha1_file()またはhash_file()の使用を検討できます。
PHP公式文書: MD5_FILE()