현재 위치: > 최신 기사 목록> hash_update_stream 함수를 사용하여 큰 파일을 처리 할 때 과도한 메모리 사용 문제를 해결하는 방법은 무엇입니까?

hash_update_stream 함수를 사용하여 큰 파일을 처리 할 때 과도한 메모리 사용 문제를 해결하는 방법은 무엇입니까?

M66 2025-06-11

PHP에서 큰 파일을 처리 할 때는 종종 메모리 사용이 과도한 문제에 직면합니다. 특히 파일의 해시 값 (예 : MD5, SHA1 등)을 계산 해야하는 경우 전체 파일이 한 번에 메모리에로드되면 메모리 소비가 크게 발생하거나 메모리 제한을 초과하여 프로그램이 중단 될 수 있습니다. 이를 피하기 위해 PHP는 해시 _update_stream 함수를 제공하여 파일을 읽고 블록으로 해시 블록을 계산하여 메모리 사용량을 효과적으로 줄일 수 있습니다.

1. Hash_update_stream 함수 소개

Hash_update_stream은 해시 계산 업데이트를위한 PHP의 함수입니다. 열린 파일 스트림 (stream)을 허용하고 블록으로 파일 내용의 해시를 업데이트합니다. 파일 내용을 메모리에 직접로드하는 것과 비교하여 Hash_update_stream은 큰 파일을 단계별로 처리하여 메모리 발자국을 크게 줄일 수 있습니다.

함수 서명은 다음과 같습니다.

 bool hash_update_stream ( resource $context , resource $file_handle [, int $length = 1024 ] )
  • $ 컨텍스트 : 이것은 hash_init 함수에 의해 생성 된 해시 컨텍스트입니다.

  • $ file_handle : 파일의 자원 핸들은 일반적으로 Fopen 함수를 통해 얻습니다.

  • $ 길이 : 시간당 읽은 바이트 수, 기본값은 1024 바이트 (1KB)입니다.

2. 큰 파일 처리의 메모리 문제를 해결하십시오

파일이 큰 파일이 있고 MD5 해시를 계산해야한다고 가정합니다. 기존의 접근 방식은 전체 파일을 메모리로 읽은 다음 해시 값을 계산하는 것입니다. 그러나 큰 파일의 경우이 연습으로 인해 메모리 오버플로가 발생할 수 있습니다.

 $file = 'path/to/largefile.txt'; // 실제 파일 경로로 교체하십시오
$context = hash_init('md5');

$handle = fopen($file, 'rb');
if ($handle) {
    while (!feof($handle)) {
        $buffer = fread($handle, 1024); // 읽다1KB데이터
        hash_update($context, $buffer);
    }
    fclose($handle);
}

$hash = hash_final($context);
echo "File MD5 hash: " . $hash;

위에서 볼 수 있듯이 파일을 청크로 읽고 hash_update를 사용하여 해시 값을 업데이트합니다. 여기서 Hash_update는 더 작은 블록에 대해 계산되지만 메모리 사용량은 블록의 크기에 따라 여전히 결정됩니다.

3. Hash_update_stream을 사용하여 메모리 사용을 최적화하십시오

hash_update를 직접 사용하는 것과 달리 Hash_update_stream 함수를 사용하면 파일 내용을 수동으로 읽지 않고 파일 스트림을 직접 처리 할 수 ​​있으므로 메모리 소비를 줄이면서 해시 값을 점진적으로 업데이트 할 수 있습니다.

최적화 된 코드는 다음과 같습니다.

 $file = 'path/to/largefile.txt'; // 실제 파일 경로로 교체하십시오
$context = hash_init('md5');

$handle = fopen($file, 'rb');
if ($handle) {
    while (!feof($handle)) {
        // 每次从文件流中읽다1024바이트 및 업데이트 해시
        hash_update_stream($context, $handle, 1024);
    }
    fclose($handle);
}

$hash = hash_final($context);
echo "File MD5 hash: " . $hash;

4. 왜 hash_update_stream이 더 효율적입니까?

hash_update_stream 의 장점은 파일의 모든 부분을 수동으로 읽지 않고 파일 스트림을 직접 처리 할 수 ​​있다는 것입니다. 이 방법을 사용하면 해시 값을 계산할 때 프로그램이 메모리 사용량을 효과적으로 줄일 수 있습니다.

  1. 블록별로 읽기 : hash_update_stream은 전체 파일을 한 번에 메모리에로드하는 대신 파일 블록의 데이터를 블록별로 읽습니다.

  2. 낮은 메모리 소비 : 스트리밍 작업을 통해 메모리 발자국은 매우 낮으며 현재 처리중인 파일 블록 만 저장해야합니다.

  3. 큰 파일에 적합 : 매우 큰 파일 (예 : 몇 개의 GB 이상)의 경우 Hash_update_stream 이 이상적입니다.

5. 실제 응용 프로그램의 URL 교체

실제 애플리케이션에서는 원격 파일의 해시 값을 계산 해야하는 시나리오가 발생할 수 있습니다. URL 주소로 가리키는 파일의 해시 값을 계산해야한다고 가정하면 비슷한 방법을 사용할 수 있습니다.

 $url = 'http://example.com/largefile.txt'; // 예 URL
$file = fopen($url, 'rb');
if ($file) {
    $context = hash_init('md5');
    while (!feof($file)) {
        hash_update_stream($context, $file, 1024);
    }
    fclose($file);

    $hash = hash_final($context);
    echo "File MD5 hash: " . $hash;
}

그러나 URL 도메인 이름 M66.net 을 교체하도록 요청하므로 위의 URL을 다음과 같이 수정할 수 있습니다.