파일 작업을 수행 할 때, 특히 다중 스레드 환경에서 큰 파일을 복사하거나 파일을 복사 할 때 동시 충돌 문제가 발생할 수 있습니다. 일반적인 동시성 문제는 복사 프로세스 중에 다른 프로세스에 의해 파일에 액세스하거나 수정되므로 파일 손상을 유발할 수있을뿐만 아니라 예측할 수없는 오류가 발생할 수 있다는 것입니다. PHP에서는 Stream_Supports_lock () 함수를 사용 하여이 문제를 피할 수 있습니다. 이 기사는 파일 복사 중에 동시 충돌이 없도록이 기능을 사용하는 방법을 설명합니다.
stream_supports_lock ()은 지정된 스트림이 파일 잠금을 지원하는지 확인하는 PHP의 내장 기능입니다. 파일 잠금은 여러 프로세스가 파일을 동시에 쓰거나 읽을 때 충돌을 피하기 위해 여러 프로세스 또는 스레드로 동일한 파일에 대한 액세스를 제어하는 데 사용되는 메커니즘입니다. Stream_Supports_lock () 함수는 개발자가 파일 작업을 수행하기 전에 데이터 보안을 보장 할 수 있는지 확인하는 데 도움이 될 수 있습니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_supports_lock</span></span><span> ( resource </span><span><span class="hljs-variable">$stream</span></span><span> )
</span></span>
매개 변수 :이 함수는 일반적으로 fopen () 함수를 통해 얻은 유효한 파일 스트림 리소스 인 매개 변수 $ stream을 허용합니다.
반환 값 : 스트림이 파일 잠금을 지원하는 경우 함수는 true를 반환합니다. 그렇지 않으면 False가 반환됩니다.
파일을 복사하기 전에 먼저 소스 파일과 대상 파일을 열어야합니다. 이것은 php의 fopen () 함수에 의해 수행 될 수 있으며 파일이 읽기 쓰기 모드로 열도록합니다.
<span><span><span class="hljs-variable">$sourceFile</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"source.txt"</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>);
</span><span><span class="hljs-variable">$destFile</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"destination.txt"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>);
</span></span>
파일 작업을 수행하기 전에 Stream_Supports_lock ()을 사용하여 파일 스트림이 잠금을 지원하는지 확인하십시오. 파일 잠금 장치가 지원되지 않으면 동시 충돌을 피하기 위해 다른 방법을 사용하는 것을 고려하십시오 (예 : 데이터베이스 잠금 또는 응용 프로그램 수준 동시 컨트롤 사용).
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_supports_lock</span></span><span>(</span><span><span class="hljs-variable">$sourceFile</span></span><span>) && </span><span><span class="hljs-title function_ invoke__">stream_supports_lock</span></span><span>(</span><span><span class="hljs-variable">$destFile</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><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
파일 스트림이 잠금을 지원하면 flock () 함수를 사용하여 소스 파일과 대상 파일을 잠글 수 있습니다. Flock () 함수를 사용하면 파일 작업 중에 잠글 수 있으므로 다른 프로세스 나 스레드가 파일에 동시에 액세스하는 것을 피할 수 있습니다.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">flock</span></span><span>(</span><span><span class="hljs-variable">$sourceFile</span></span><span>, LOCK_SH) && </span><span><span class="hljs-title function_ invoke__">flock</span></span><span>(</span><span><span class="hljs-variable">$destFile</span></span><span>, LOCK_EX)) {
</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">$sourceFile</span></span><span>)) {
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$sourceFile</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$destFile</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
}
</span><span><span class="hljs-comment">// 잠금을 해제하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">flock</span></span><span>(</span><span><span class="hljs-variable">$sourceFile</span></span><span>, LOCK_UN);
</span><span><span class="hljs-title function_ invoke__">flock</span></span><span>(</span><span><span class="hljs-variable">$destFile</span></span><span>, LOCK_UN);
} </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><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>
LOCK_SH : 공유 잠금 장치로 다른 프로세스가 읽기 전용 모드에서 파일에 액세스 할 수 있습니다.
LOCK_EX : 독점 잠금, 다른 프로세스가 파일에 액세스하는 것을 금지합니다.
Lock_un : 잠금 해제.
파일 복사를 마친 후에는 파일 스트림을 닫아 시스템 리소스를 확보해야합니다.
<span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$sourceFile</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$destFile</span></span><span>);
</span></span>
stream_supports_lock () 및 flock () 함수를 사용하여 PHP는 파일 복사 중에 동시 충돌이 발생하지 않도록 효과적인 파일 잠금 메커니즘을 제공합니다. 합리적인 파일 잠금 제어를 통해 데이터의 무결성을 보장하고 파일 손상 또는 복사 오류를 피할 수 있습니다. 다중 프로세스 또는 다중 스레드 파일 작업의 경우 파일 잠금을 사용하는 것이 동시성 보안을 보장하는 중요한 수단입니다.