현재 위치: > 최신 기사 목록> file_get_contents 큰 파일을 읽을 때 메모리가 불충분 한 경우 어떻게해야합니까? 원인과 솔루션에 대한 자세한 설명

file_get_contents 큰 파일을 읽을 때 메모리가 불충분 한 경우 어떻게해야합니까? 원인과 솔루션에 대한 자세한 설명

gitbox 2025-06-09

file_get_contents 큰 파일을 읽을 때 메모리가 불충분 한 경우 어떻게해야합니까? 원인과 솔루션에 대한 자세한 설명

php에서 file_get_contents 함수를 사용하여 파일을 읽을 때 파일이 너무 크면 메모리가 충분하지 않을 수 있습니다. 이 기사는이 문제를 일으키는 원인을 자세히 분석하고 효과적인 솔루션을 제공합니다.

1. 문제 분석

file_get_contents는 파일 내용을 읽는 데 PHP에서 매우 일반적으로 사용되는 기능입니다. 사용하기가 매우 간단합니다. 예를 들어 파일 경로를 전달하십시오.

 $content = file_get_contents('path/to/large/file.txt');

그러나 파일이 매우 크면 file_get_contents는 전체 파일의 내용을 한 번에 메모리에로드합니다. 파일 크기가 PHP 메모리 제한 ( Memory_Limit )을 초과하면 메모리 외 오류가 발생합니다.

2. 기억이 충분하지 않은 이유는 무엇입니까?

기본적으로 PHP는 스크립트가 사용할 수있는 최대 메모리를 제한합니다 ( Memory_Limit 구성 항목을 통해). File_get_Contents를 사용하여 큰 파일을 읽으면 PHP는 전체 파일의 내용을 메모리에로드합니다. 파일 크기 가이 메모리 제한을 초과하면 스크립트가 충돌하고 "메모리 외"오류가 발생합니다.

예를 들어, 수백 MB 또는 GB의 파일을 읽으면 File_Get_Contents는 전체 파일을 메모리에로드하려고 시도하고 PHP의 메모리 제한이 초과되면 오류 가보고됩니다.

3. 솔루션

3.1 PHP 메모리 제한을 늘립니다

가장 직접적인 방법은 php의 메모리 제한을 늘리는 것입니다. Php.ini 파일에서 memory_limit을 수정하여 달성 할 수 있습니다.

 memory_limit = 512M

또는 PHP 스크립트에서 메모리 제한을 동적으로 설정할 수 있습니다.

 ini_set('memory_limit', '512M');

그러나이 접근법은 매우 큰 파일의 경우 메모리 제한이 추가 되더라도 메모리 오버플로를 피할 수 없기 때문에 반드시 작동하지는 않습니다.

3.2 FopenFread를 사용하여 세그먼트에서 파일을 읽으십시오.

한 번에 전체 파일을 메모리에로드하지 않기 위해 세그먼트 독서를 사용하여 FopenFread 함수를 사용하여 블록별로 파일 내용을 읽을 수 있습니다.

 $handle = fopen('path/to/large/file.txt', 'r');
if ($handle) {
    while (($chunk = fread($handle, 8192)) !== false) {
        // 각 블록의 프로세스 데이터
        echo $chunk;  // 콘텐츠를 직접 출력하거나 다른 처리를 수행 할 수 있습니다.
    }
    fclose($handle);
} else {
    echo "파일을 열 수 없습니다";
}

이것의 장점은 파일의 컨텐츠의 일부만 한 번에 읽히고 너무 많은 메모리를 사용하지 않는다는 것입니다.

3.3 file_get_contentsstream_context_create를 사용하여 stream_context_create를 결합하십시오

stream_context_create를 사용하여 스트림 컨텍스트를 만들고 file_get_contents 와 함께 스트림 읽기를 만들 수도 있습니다. 이렇게하면 전체 파일이 한 번에 메모리에로드되는 것을 방지합니다. 예는 다음과 같습니다.

 $options = [
    'http' => [
        'method' => 'GET',
        'header' => "Content-Type: text/plain\r\n"
    ]
];

$context = stream_context_create($options);
$content = file_get_contents('http://gitbox.net/path/to/large/file.txt', false, $context);

이 접근법은 HTTP 요청을 처리하는 데 더 적합하지만 다른 스트리밍 시나리오에서도 사용할 수 있습니다.

3.4 SPL_FILE_OBJECT를 사용하여 파일을 처리하십시오

SplfileObject 는 PHP의 내장 클래스이며 특히 파일을 처리하는 데 사용됩니다. 전체 파일을 한 번에 메모리에로드하는 것을 피하고 파일을 라인별로 읽으려면이를 사용하십시오. 예는 다음과 같습니다.

 $file = new SplFileObject('path/to/large/file.txt');
while (!$file->eof()) {
    $line = $file->fgets();
    echo $line;  // 파일 컨텐츠를 한 줄씩 처리하십시오
}

이 방법은 텍스트 파일을 처리하는 데 적합하며 한 번에 한 줄만 읽으며 메모리 사용량은 매우 작습니다.

3.5 명령 줄 도구를 사용하여 큰 파일을 처리합니다

경우에 따라 PHP의 메모리 제한과 읽기 속도가 여전히 필요에 맞지 않으면 일부 시스템 레벨 명령 줄 도구를 사용하여 CAT , AWK 또는 SED 와 같은 큰 파일을 처리 한 다음 PHP의 EXEC 기능을 통해 이러한 도구를 호출 할 수 있습니다.

 $output = shell_exec('cat /path/to/large/file.txt');
echo $output;

이 방법은 대형 파일을 처리 할 때 빠른 읽기에 적합하지만 시스템 도구의 보안 및 권한을 보장하기 위해주의하십시오.

3.6 Curl을 사용하여 원격 파일을 얻으십시오

원격 서버에서 큰 파일을 가져와야하는 경우 CURL을 사용하여 파일을 청크로 다운로드 할 수 있습니다. Curl은 HTTP 다운로드를 지원하여 전체 파일을 한 번에 메모리에로드하는 것을 피할 수 있습니다. 예제는 다음과 같습니다.

 $ch = curl_init('http://gitbox.net/path/to/large/file.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
$content = curl_exec($ch);
curl_close($ch);

이 방법은 원격 대형 파일을 처리 할 때 읽기 스트리밍에 특히 적합합니다.

4. 요약

FILE_GET_CONTENTS 의 불충분 한 메모리 문제 대형 파일을 처리 할 때 일반적으로 PHP 파일을 한 번에 메모리에로드하여 발생합니다. 메모리 오류가 충분하지 않도록하기 위해 메모리 제한 증가, 청크 파일 읽기, 스트리밍 읽기 메소드 사용 등과 같은 다양한 방법을 선택할 수 있습니다.

다른 상황에 대해 다른 솔루션을 선택할 수 있지만 기본 목표는 메모리 사용량을 줄이고 너무 많은 데이터를 한 번에로드하지 않도록하는 것입니다. 이 기사에 제공된 솔루션이 큰 파일을 처리 할 때 메모리가 충분하지 않은 문제를 해결하는 데 도움이되기를 바랍니다.