PHP에서 FFFLUSH 함수는 파일 포인터가 파일에있는 파일 스트림을 새로 고침하는 데 사용됩니다. 그러나 개봉되지 않은 파일 핸들에서 fflush 함수를 호출하면 예기치 않은 동작이나 오류가 발생할 수 있습니다. 이 문제를 이해하려면 먼저 Fflush 의 작동 방식과 파일 작업에서 파일 핸들의 중요성을 이해해야합니다.
fflush 함수의 함수는 파일 스트림의 캐시 된 데이터를 대상 파일로 강제하는 것입니다. 일반적으로 파일에 쓸 때 PHP는 즉시 하드 디스크에 쓰는 대신 메모리의 데이터를 캐시합니다. 성능을 향상시키기 위해 PHP는 버퍼가 가득 차 있거나 파일 핸들이 파일에 데이터를 작성하기 전에 닫을 때까지 대기합니다. 그러나 때로는 개발자가 특정 순간에 캐시 새로 고침 작업을 수동으로 트리거하고 싶을 수도 있으며 Fflush는 매우 유용합니다.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"example.txt"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">"Hello, World!"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fflush</span></span><span>(</span><span><span class="hljs-variable">$file</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">$file</span></span><span>);
</span></span>개봉되지 않은 파일 핸들에서 fflush 함수를 호출하면 어떻게됩니까? 첫째, Fflush 함수는 유효한 파일 리소스에 따라 다릅니다. 파일 핸들이 유효하지 않은 경우 (예 : 파일이 성공적으로 열리지 않음) Fflush를 호출하면 오류가 발생합니다. PHP의 플러시 함수는 fclose 와 같은 치명적인 오류를 직접 던지지 않지만 False를 반환하여 새로 고침 작업이 실패했음을 나타냅니다.
파일 작동 중에 파일 핸들이 열리지 않도록 개발자는 FFLUSH를 호출하기 전에 파일 핸들이 유효한지 확인해야합니다. is_resource 함수를 사용하여 파일 핸들이 유효한지 확인할 수 있습니다. 간단한 오류 처리 예는 다음과 같습니다.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"example.txt"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span> && </span><span><span class="hljs-title function_ invoke__">is_resource</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">"Hello, World!"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fflush</span></span><span>(</span><span><span class="hljs-variable">$file</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">$file</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>이 예에서는 먼저 fopen을 통해 파일을 열고 is_resource 함수를 사용하여 파일 핸들이 유효한지 확인합니다. 파일이 열리지 않거나 파일 핸들이 유효하지 않은 경우 프로그램은 잘못된 핸들에서 fflush를 호출하지 않도록 오류 메시지를 출력합니다.
좋은 자원 관리는 파일 핸들을 처리 할 때 매우 중요합니다. 파일 핸들이 유효한지 확인하는 것 외에도 작업이 완료된 후 파일을 제 시간에 닫는 데주의를 기울여야합니다. 파일 핸들을 닫으면 시스템 리소스를 해방시킬뿐만 아니라 기록되지 않은 모든 데이터가 파일에 플러시되도록합니다.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"example.txt"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">"Some content..."</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fflush</span></span><span>(</span><span><span class="hljs-variable">$file</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">$file</span></span><span>); </span><span><span class="hljs-comment">// 파일 핸들을 닫습니다</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>이 예에서 Fflush는 파일의 내용이 fclose 전에 올바르게 기록되도록하는 데 사용됩니다. fclose 자체가 파일 캐시를 자동으로 새로 고치지 만 수동으로 fflush를 호출하면 데이터가 즉시 디스크에 기록되도록합니다.
일반적으로, 개봉되지 않은 파일 핸들에서 fflush를 호출하면 기능이 False를 반환하고 유효한 새로 고침 작업이 수행되지 않습니다. 이 문제를 피하기 위해 개발자는 Fflush를 호출하기 전에 파일 핸들이 성공적으로 열리고 유효했는지 확인해야합니다. 확인을 위해 IS_RESOURCE 기능을 사용하는 것은 매우 효과적인 예방 측정입니다. 또한 파일 핸들을 제 시간에 닫고 합리적인 파일 작동 시퀀스도 파일 처리의 모범 사례입니다.
이러한 측정을 통해 파일 운영의 안정성과 보안을 보장 할 수 있으며 파일 핸들 오류로 인해 프로그램이 발생할 수있는 예상치 못한 문제입니다.