PHP開発では、 MD5_FILE()関数を使用して、ファイルのMD5ハッシュ値を取得するためによく使用されます。これは、ファイルの整合性の検証やファイルの変更の検出に便利です。ただし、同じファイルのバッチで複数回呼び出すためにmd5_file()が必要な場合、頻繁にディスクIO操作はプログラムの実行効率を大幅に低下させる可能性があります。この目的のために、キャッシュメカニズムを介して複数の呼び出しが呼び出されると、MD5_FILE()関数の実行効率を改善できます。
md5_file()関数が呼び出されるたびに、ディスクからファイルコンテンツ全体を読み取り、md5値を計算します。同じファイルが複数回呼び出された場合、ファイルコンテンツは繰り返し読み取り、特にファイルが大きい場合やファイルの数が多い場合、不必要なリソース消費を引き起こします。パフォーマンスの損失はより明白です。
キャッシュメカニズムのコアアイデアは、 MD5_FILE()が初めて呼び出されたときに結果を計算して保存し、同じファイルを再度要求するときにキャッシュからハッシュ値を直接取得して、繰り返し計算を避けます。
キャッシュは、メモリ(配列、静的変数など)、ファイル、またはその他のストレージメディアに保存でき、実際のシーンに応じて選択されます。
MD5_FILE()結果のキャッシュを実装するメモリキャッシュに基づく簡単な例を次に示します。
<?php
class Md5FileCache {
private static $cache = [];
/**
* ファイルを取得しますMD5価値,キャッシングをサポートします
*
* @param string $filePath ファイルパス
* @return string|false 戻るMD5弦,失败戻るfalse
*/
public static function getMd5(string $filePath) {
// キャッシュが最初に存在するかどうかを確認してください
if (isset(self::$cache[$filePath])) {
return self::$cache[$filePath];
}
// キャッシュは存在しません,計算しますMD5
if (!file_exists($filePath)) {
return false;
}
$md5 = md5_file($filePath);
if ($md5 !== false) {
self::$cache[$filePath] = $md5;
}
return $md5;
}
}
// 使用の例
$file = '/path/to/your/file.txt';
$md5_1 = Md5FileCache::getMd5($file);
$md5_2 = Md5FileCache::getMd5($file); // ここでキャッシュから直接入手してください,避免重复計算します
echo "MD5: " . $md5_1 . PHP_EOL;
?>
ファイルの変更により、キャッシュの結果が無効になる可能性があるため、ファイルの変更時間( filemtime() )と組み合わせてキャッシュの確認を実行する必要があります。
<?php
class Md5FileCache {
private static $cache = [];
public static function getMd5(string $filePath) {
if (!file_exists($filePath)) {
return false;
}
$mtime = filemtime($filePath);
if (isset(self::$cache[$filePath]) && self::$cache[$filePath]['mtime'] === $mtime) {
return self::$cache[$filePath]['md5'];
}
$md5 = md5_file($filePath);
if ($md5 !== false) {
self::$cache[$filePath] = [
'md5' => $md5,
'mtime' => $mtime,
];
}
return $md5;
}
}
?>
プログラムが長い間実行されている場合、またはリクエスト全体でキャッシュする必要がある場合は、