현재 위치: > 최신 기사 목록> 큰 파일에서 md5_file ()을 사용하면 어떻게해야합니까?

큰 파일에서 md5_file ()을 사용하면 어떻게해야합니까?

M66 2025-05-28

PHP에서 MD5_File은 파일의 MD5 해시 값을 계산하는 매우 편리한 기능입니다. 사용량은 간단합니다. 파일 경로로 전달하십시오.

 $hash = md5_file('http://m66.net/path/to/largefile.zip');
echo $hash;

그러나 파일이 매우 크면 MD5_File을 사용하면 메모리 서지가 발생하고 메모리 오버 플로우 오류가 발생할 수 있습니다. PHP는 내부적으로 전체 파일을 메모리로 읽으려고 노력하기 때문입니다. 특히 원격 URL 일 때 많은 메모리를 소비하기가 더 쉽습니다.


MD5_File이 메모리가 급증하는 이유는 무엇입니까?

md5_file 은 쉬운 기능이지만 실제로는 기본 레이어에서 실제로 작동 할 때 전체 파일을 버퍼링합니다. 수백 메가 바이트 또는 몇 개의 GB가있는 대형 파일의 경우 메모리 풋 프린트가 매우 높으며 PHP의 메모리 제한을 초과하기가 쉽습니다.


더 많은 메모리 절약 대안

메모리 서지를 피하기 위해 청크에서 파일 스트림을 읽고 세그먼트에서 MD5를 계산하는 솔루션을 구현할 수 있습니다. 이렇게하면 한 번에 작은 데이터 만 읽히고 메모리 사용량은 매우 낮습니다.

체계 예 :

 function md5_file_stream(string $filename): string|false {
    // 원격이라면URL,먼저 프로토콜 헤더가 지원하는지 확인하십시오
    $context = stream_context_create([
        'http' => ['method' => 'GET', 'timeout' => 10]
    ]);

    // 파일 스트림을 열어보십시오
    $fp = fopen($filename, 'rb', false, $context);
    if (!$fp) {
        return false;
    }

    $hashContext = hash_init('md5');

    while (!feof($fp)) {
        // 각각 읽습니다8KB,낮은 메모리 압력
        $data = fread($fp, 8192);
        if ($data === false) {
            fclose($fp);
            return false;
        }
        hash_update($hashContext, $data);
    }

    fclose($fp);

    return hash_final($hashContext);
}

// 사용의 예
$url = 'http://m66.net/path/to/largefile.zip';
$md5 = md5_file_stream($url);
if ($md5 !== false) {
    echo "더럽히는 MD5 가치는입니다:$md5\n";
} else {
    echo "파일 또는 계산 된 오류를 읽지 못했습니다。\n";
}

프로그램 장점

  • 메모리 저장 : 한 번에 소량의 데이터 만 읽으면 메모리 사용이 안정적입니다.

  • 대형 파일에 적용 가능 : 지원 해시 로컬 및 원격 대형 파일의 계산.

  • 높은 유연성 : 다른 시나리오에 적응하도록 읽기 블록 크기 (예 : 16KB, 32KB 등)를 조정할 수 있습니다.


요약

MD5에 의해 계산 해야하는 큰 파일을 만나고 MD5_File 메모리 사용이 너무 높기 때문에 청크 독서를 사용하여 해시를 계산하는 것이 더 나은 선택입니다. 메모리 폭발을 피할뿐만 아니라 코드를 간단하고 효율적으로 유지합니다.