PHP에서 파일 작업을 수행 할 때 특히 다중 프로세스 또는 다중 스레드 환경에서 작업의 원자력과 보안을 보장하는 것이 매우 중요합니다. Flock () 함수 및 fsync () 함수는 일반적으로 사용되는 두 가지 도구입니다. 파일 운영의 무결성을 효과적으로 보장하고 데이터 경쟁 및 쓰기 손실을 피할 수 있습니다. 이 기사는이 두 기능의 역할과 합리적으로 사용하는 방법에 대해 자세히 소개합니다.
Flock () 함수는 동일한 파일을 동시에 수정하는 여러 프로세스를 피하기 위해 파일을 잠그는 데 사용되므로 데이터 혼동이 발생합니다. Shared Lock ( Lock_sh )과 독점 잠금 ( Lock_ex )의 두 가지 잠금 유형을 제공합니다.
공유 잠금 (LOCK_SH) : 여러 프로세스가 파일을 읽을 수 있지만 쓰기는 허용하지 않습니다.
독점 잠금 (LOCK_EX) : 독점 잠금, 하나의 프로세스가 파일을 쓸 수있는 반면 다른 프로세스는 읽고 쓸 수 없습니다.
샘플 코드 :
<?php
$fp = fopen('data.txt', 'c+');
if (flock($fp, LOCK_EX)) { // 독점 잠금 장치를 추가하십시오
// 파일 쓰기 작업을 수행합니다
fwrite($fp, "데이터 작성\n");
fflush($fp); // 버퍼 데이터를 파일 시스템에 쓰십시오
flock($fp, LOCK_UN); // 잠금을 해제하십시오
}
fclose($fp);
?>
PHP 자체는 fsync () 함수를 직접 제공하지는 않지만 fflush () 함수의 도움으로 버퍼를 새로 고칠 수 있으며, fsync ()는 운영 체제가 커널 캐시 된 데이터를 디스크에 쓸 수 있도록 시스템 호출입니다. fflush () 가 버퍼를 플러시하지만 디스크 데이터가 지속될 것이라고 보장 할 수는 없습니다. Linux 환경에서는 posix_fsync (확장 지원 지원)와 함께 Stream_get_meta_data 및 fstat를 통해 구현할 수 있습니다.
샘플 통화 (지원되는 환경) :
<?php
$fp = fopen('data.txt', 'c+');
if (flock($fp, LOCK_EX)) {
fwrite($fp, "데이터 작성\n");
fflush($fp);
// posix_fsync데이터가 디스크에 기록되어 있는지 확인하십시오
if (function_exists('posix_fsync')) {
posix_fsync($fp);
}
flock($fp, LOCK_UN);
}
fclose($fp);
?>
Atomicity : Flock ()은 데이터 경쟁을 피하면서 하나의 프로세스 만 파일에 동시에 쓸 수 있도록합니다.
보안 : fflush () 및 fsync () (또는 유사한 함수)를 사용하여 데이터가 디스크에 기록되도록하여 시스템 충돌 또는 전원 고장으로 인해 데이터 손실을 방지합니다.
Complete example:
<?php
$file = '/path/to/data.txt';
$fp = fopen($file, 'c+');
if (!$fp) {
die('파일을 열 수 없습니다');
}
if (flock($fp, LOCK_EX)) {
// 파일 포인터를 파일 끝으로 이동하십시오,적용 범위를 피하십시오
fseek($fp, 0, SEEK_END);
fwrite($fp, "安全데이터 작성\n");
fflush($fp); // 할 것이다PHP버퍼 데이터는 운영 체제 캐시에 기록됩니다
// 지원되는 시스템 환경에서,사용fsync系统调用할 것이다数据写入磁盘
if (function_exists('posix_fsync')) {
posix_fsync($fp);
}
flock($fp, LOCK_UN);
} else {
echo "파일 잠금을 얻을 수 없습니다";
}
fclose($fp);
?>
Flock ()는 동시 쓰기 중에 데이터의 잘못을 방지하기 위해 잠금 메커니즘을 통해 동시 파일 작업의 원자력을 보장합니다.
ffflush () 및 fsync ()는 프로그램 버퍼에서 운영 체제 캐시로 데이터를 작성한 다음 디스크와 동기화하여 데이터 보안을 향상시킵니다.
이 둘의 조합은 파일 쓰기 프로세스의 위험을 크게 줄일 수 있으며 로그 쓰기 및 안전한 쓰기가 필요한 구성 파일 업데이트와 같은 시나리오에 적합합니다.
개발 중 파일 작업의 안정성과 보안을 보장 해야하는 경우 fsync () 아이디어와 함께 Flock ()을 사용하는 것이 좋습니다.
<?php
$file = 'https://m66.net/path/to/data.txt';
$fp = fopen($file, 'c+');
if (!$fp) {
die('파일을 열 수 없습니다');
}
if (flock($fp, LOCK_EX)) {
fseek($fp, 0, SEEK_END);
fwrite($fp, "安全데이터 작성\n");
fflush($fp);
if (function_exists('posix_fsync')) {
posix_fsync($fp);
}
flock($fp, LOCK_UN);
} else {
echo "파일 잠금을 얻을 수 없습니다";
}
fclose($fp);
?>