>백엔드 개발 >PHP 튜토리얼 >대용량 파일에 file_get_contents()를 사용할 때 메모리 고갈 오류를 방지하는 방법은 무엇입니까?

대용량 파일에 file_get_contents()를 사용할 때 메모리 고갈 오류를 방지하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-17 13:43:29596검색

How to Avoid Memory Exhaustion Errors when Using file_get_contents() with Large Files?

File_get_contents 메모리 고갈: 포괄적인 솔루션

대용량 파일 처리를 처리할 때 악명 높은 PHP Fatal error: Allowed memory Exhausted 오류가 반복되는 문제가 될 수 있습니다. 이 문제는 file_get_contents()가 크기 조정 가능한 파일의 전체 내용을 메모리로 읽으려고 시도할 때 발생하며, 종종 할당된 메모리 제한을 초과합니다.

file_get_contents()의 대안

전체 파일을 로드하는 대신 더 효율적인 접근 방식은 파일을 포인터로 열고 fread()를 사용하여 더 작은 덩어리로 읽는 것입니다. 이를 통해 대용량 파일을 처리하는 데 중요한 메모리 관리가 가능해집니다.

아래는 Node.js의 파일 처리 API 기능을 모방한 사용자 정의 함수입니다.

<code class="php">function file_get_contents_chunked($file, $chunk_size, $callback)
{
    try {
        $handle = fopen($file, "r");
        $i = 0;
        while (!feof($handle)) {
            call_user_func_array($callback, array(fread($handle, $chunk_size), &$handle, $i));
            $i++;
        }
    } catch (Exception $e) {
        trigger_error("file_get_contents_chunked::" . $e->getMessage(), E_USER_NOTICE);
        return false;
    }
    fclose($handle);

    return true;
}</code>

이 함수는 세 가지를 허용합니다. 매개변수: 파일 경로, 원하는 청크 크기, 청크 읽기마다 호출될 콜백 함수

커스텀 함수 사용

file_get_contents_chunked() 함수는 다음과 같이 사용할 수 있습니다. :

<code class="php">$success = file_get_contents_chunked("my/large/file", 4096, function ($chunk, &$handle, $iteration) {
    /* Process the chunk here... */
});</code>

정규식 고려 사항

큰 데이터 덩어리에 대해 여러 정규식 작업을 수행하는 것은 비효율적입니다. strpos(), substr(), Trim() 및Explode()와 같은 기본 문자열 조작 기능을 사용하는 것이 좋습니다.

정리 예

대신:

<code class="php">$newData = str_replace("^M", "", $myData);</code>

용도:

<code class="php">$pattern = '/\r\n/';
$replacement = '';
$newData = preg_replace($pattern, $replacement, $myData);</code>

위의 기술을 활용하면 메모리 소모 오류 없이 대용량 파일을 효과적으로 처리할 수 있습니다.

위 내용은 대용량 파일에 file_get_contents()를 사용할 때 메모리 고갈 오류를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.