PHP에서 MD5_FILE () 함수는 주어진 파일의 MD5 해시 값을 계산하는 데 사용되며 종종 파일 무결성을 확인하거나 파일 콘텐츠를 고유하게 식별하는 데 사용됩니다. 사용하는 것이 간단하고 편리하지만 동시성 높은 환경에서 MD5_File ()을 호출 할 때 개발자는 성능 병목 현상 또는 부정확 한 결과를 피하기 위해 잠재적 인 문제에주의를 기울여야합니다.
md5_file ()은 본질적으로 파일 내용을 읽고 해시 값을 계산합니다. 동시 환경에서 여러 프로세스 나 스레드가 동시에 동일한 파일에 읽고 쓰면 다음과 같은 것으로 이어질 수 있습니다.
불완전하거나 서면 데이터가 읽히므로 계산 된 MD5 값은 정확하지 않습니다.
파일이 잠금으로 기록되기 때문에 읽기 작업이 차단되어 동시성 성능에 영향을 미칩니다.
해결책:
파일을 작성할 때 파일 잠금 ( Flock () )을 사용하여 쓰기가 완료된 후에 만 잠금이 해제되고 동시 판독 중에 반제품 파일을 얻지 마십시오.
읽을 때 잠금이 추가되거나 메커니즘이 파일을 작성하고 MD5를 계산하는지 확인하기 위해 메커니즘이 사용됩니다.
$filename = '/path/to/file.txt';
// 글을 쓸 때 잠금
$file = fopen($filename, 'c+');
if (flock($file, LOCK_EX)) {
ftruncate($file, 0);
fwrite($file, '새로운 콘텐츠');
fflush($file);
flock($file, LOCK_UN);
}
fclose($file);
// 독서 중에 쓰여지지 않도록 독서 중에 잠금이 추가됩니다.
$file = fopen($filename, 'r');
if (flock($file, LOCK_SH)) {
$md5 = md5_file($filename);
flock($file, LOCK_UN);
}
fclose($file);
echo "더럽히는MD5값: " . $md5;
일부 운영 체제 또는 파일 시스템에는 파일 작업에 대한 캐시 메커니즘이있을 수 있으며, 파일 변경 후 짧은 시간에 이전 데이터를 읽어 MD5_File () 의 정확도에 영향을 미칩니다.
해결책:
CLEARSTATCACHE () 함수를 사용하여 파일 상태 캐시를 정리하여 최신 파일 상태를 읽으십시오.
clearstatcache(true, $filename);
$md5 = md5_file($filename);
md5_file ()은 전체 파일 내용을 읽습니다. 파일이 크거나 통화 주파수가 매우 높으면 I/O 병목 현상으로 이어지고 시스템의 전반적인 성능에 영향을 줄 수 있습니다.
최적화 제안 :
파일이 변경되었는지 확인하면 파일 수정 시간 filemtime () 및 파일 크기 파일 크기 () 에 따라 예비 판단을 할 수 있습니다. 파일 변경이 확인 된 경우에만 MD5_File ()을 호출하십시오.
보다 효율적인 비동기 처리 또는 대기열 메커니즘을 사용하여 빈번한 계산을 피하십시오.
큰 파일의 경우 청크 컴퓨팅 해싱을 고려하거나보다 효율적인 해싱 알고리즘을 사용할 수 있습니다.
$filename = '/path/to/file.txt';
$lastMtime = 0;
$lastFilesize = 0;
$lastMd5 = '';
$currentMtime = filemtime($filename);
$currentFilesize = filesize($filename);
if ($currentMtime !== $lastMtime || $currentFilesize !== $lastFilesize) {
clearstatcache(true, $filename);
$lastMd5 = md5_file($filename);
$lastMtime = $currentMtime;
$lastFilesize = $currentFilesize;
}
echo "문서MD5: " . $lastMd5;
분산 또는 다중 프로세스 환경에서 로컬 파일 잠금에만 의존한다고해서 여러 인스턴스 간의 원자 작동을 보장하지는 않습니다. 현재 더 고급 동기화 메커니즘이 필요합니다.
분산 잠금 장치 (예 : Redis, Zookeeper 등의 잠금 장치 등)를 사용하십시오.
파일 처리의 작업 큐를 설계하여 프로세스 작동 파일이 동시에 하나만 있는지 확인하십시오.
원격 파일과 같은 URL에 따라 파일 경로가 얻어지면 다음과 같습니다.
네트워크 요청의 안정성 및 시간 초과 처리.
원격 파일의 내용이 변경 될 수 있으며 MD5_File ()을 호출하려면 원격 서버가 지원하고 파일 읽기를 허용해야합니다.
여기에서 도메인 이름을 바꾸어야하는 경우이 예에서 도메인 이름은 m66.net 으로 대체됩니다.