파일 () 함수는 파일의 각 줄을 배열 요소로 읽는 PHP의 내장 함수입니다. 기본 사용량은 다음과 같습니다.
<span><span><span class="hljs-variable">$file_array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>);
</span></span>
이렇게하면 BargenFile.txt 파일의 각 줄을 배열의 요소로 메모리로 읽습니다. 파일이 매우 크면 많은 메모리를 소비하고 메모리 오버플로 문제를 유발할 수 있습니다.
파일 () 함수는 파일의 각 줄을 메모리로 읽고 배열을 반환합니다. 파일이 매우 큰 경우, 특히 수백 메가 바이트 이상을 초과하는 파일은 모든 파일 내용이 동시에 메모리에 저장되어 메모리 사용이 급격히 증가합니다. 메모리가 상한에 도달하면 PHP는 메모리 오버플로 오류를 던집니다.
전체 파일을 한 번에 메모리에로드하지 않기 위해 fopen () 함수를 사용하여 fgets ()를 결합하여 파일 컨텐츠를 라인별로 읽을 수 있습니다. 이렇게하면 파일의 한 줄만 전체 파일이 아닌 한 번에 읽기 때문에 메모리 사용이 줄어 듭니다.
<span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// 각 라인을 처리하십시오</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'파일을 열 수 없습니다'</span></span><span>;
}
</span></span>
이 메소드는 파일을 라인별로 읽고 메모리 사용량을 크게 줄이고 큰 파일을 처리하는 데 적합합니다.
라인별 읽기 외에도 FSEEK () 및 FREAD () 함수를 사용하여 파일을 블록별로 읽을 수 있습니다. fseek ()는 파일 포인터를 찾을 수 있지만 fread ()는 지정된 크기의 데이터 블록을 읽을 수 있습니다. 이 접근법은 특히 데이터의 특정 부분을 처리해야 할 때 큰 파일을 처리 해야하는 시나리오에 적합합니다.
<span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) {
</span><span><span class="hljs-comment">// 각각 읽습니다 1MB 데이터</span></span><span>
</span><span><span class="hljs-variable">$chunk</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-number">1048576</span></span><span>); </span><span><span class="hljs-comment">// 1MB = 1024 * 1024 bytes</span></span><span>
</span><span><span class="hljs-comment">// 处理读取的데이터块</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'파일을 열 수 없습니다'</span></span><span>;
}
</span></span>
고정 크기의 청크를 읽으면 메모리 사용량을 줄이고 파일 데이터를 단계별로 처리 할 수 있습니다.
파일이 크고 File () 함수를 사용해야하는 경우 다른 방법은 PHP의 메모리 제한을 적절하게 늘리는 것입니다. php.ini 파일에서 memory_limit 설정을 수정하거나 코드에서 ini_set ()를 동적으로 설정하여 메모리 사용 제한을 늘릴 수 있습니다.
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'memory_limit'</span></span><span>, </span><span><span class="hljs-string">'512M'</span></span><span>); </span><span><span class="hljs-comment">// AS를 설정합니다 512MB</span></span><span>
</span></span>
메모리 제한을 증가시키는 것은 때때로 메모리 오버 플로우 문제를 해결할 수 있지만, 특히 동시성이 높은 경우 서버 메모리의 과도한 사용으로 이어질 수 있으므로 장기 솔루션이 아닙니다.
PHP의 splfileobject 클래스는 파일을 읽는 효율적인 방법을 제공합니다. File () 함수와 달리 SplfileObject는 전체 파일을 메모리에로드하는 것을 피하면서 파일 내용을보다 유연하게 읽을 수있는 객체입니다. 반복자를 통해 라인별로 파일을 읽어 메모리를 저장할 수 있습니다.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">SplFileObject</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>);
</span><span><span class="hljs-variable">$file</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setFlags</span></span><span>(</span><span><span class="hljs-title class_">SplFileObject</span></span><span>::</span><span><span class="hljs-variable constant_">READ_CSV</span></span><span>); </span><span><span class="hljs-comment">// 파일 읽기 형식을 설정할 수 있습니다</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$line</span></span><span>) {
</span><span><span class="hljs-comment">// 각 라인을 처리하십시오</span></span><span>
}
</span></span>
SplFileObject는 라인별로 파일을 읽고 파일 포인터를 자동으로 관리 할 수 있으므로 큰 파일을 처리 할 때 매우 효율적인 선택입니다.
큰 파일을 읽어야 할 때 File () 함수를 사용하여 전체 파일을 메모리에로드하므로 최상의 선택이 아닐 수 있습니다. 메모리 오버 플로우를 피하기 위해 다음 방법을 사용할 수 있습니다.
fopen () 및 fgets ()를 사용하여 모든 것을 한 번에로드하지 않도록 파일을 라인별로 읽으십시오.
블록 판독에는 fseek () 및 fread ()를 사용하여 특정 데이터의 특정 부분을 처리하는 데 특히 적합합니다.
PHP의 메모리 제한 증가는 장기 솔루션으로 권장되지는 않지만 경우에 따라 문제를 해결할 수 있습니다.
splfileobject 클래스를 사용하면 파일을 읽는보다 유연하고 효율적인 파일을 읽는 방법을 제공합니다. 이는 특히 대규모 파일 작업에 적합합니다.
특정 요구에 따라 적절한 방법을 선택하면 메모리 오버플로를 효과적으로 피하고 프로그램 성능을 향상시킬 수 있습니다.