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;
}
}
?>
프로그램이 오랫동안 실행되거나 요청에 따라 캐시 해야하는 경우