개발자의 끄적끄적

[php] 파일 락 걸기 본문

개발/php

[php] 파일 락 걸기

효벨 2020. 1. 20. 02:00
728x90
반응형

[php] 파일 락 걸기

1

2

boolean flock(resource fp, int operation[, int &wouldblock])

// wouldblock : 락을 얻는 과정에서 현재 프로세스가 멈출 수도 있는지

operation의미

LOCK_SH (1) 읽기 락. 파일 공유 가능.
LOCK_EX (2) 쓰기 락. 파일 공유 불가능.
LOCK_UN (3) 락 해제.
LOCK_NB (4) 락을 걸기 위해 스크립트가 정지하는 것을 막는다.

락을 사용하려면 모든 스크립트에서 flock을 사용해야 한다. 그렇지 않으면 큰 의미가 없어진다.

NFS나 다른 네트워크 파일 시스템 또는 FAT과 같이 오래된 파일 시스템에서는 사용할 수 없다.
다중 쓰레드 서버 API를 사용하고 있다면 제대로 동작하지 않을 수 있다.

1

2

3

4

5

6

7

8

9

10

11

12

13

// 쓰기 과정

$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab');

flock($fp, LOCK_EX); // 쓰기 락

fwrite($fp, $outputstring);

flock($fp, LOCK_UN); // 락 해제

fclose($fp);

 

// 읽기 과정

$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'r');

flock($fp, LOCK_SH); // 읽기 락

// 파일에서 읽는다.

flock($fp, LOCK_UN); // 락 해제

fclose($fp);

하지만 여전히 문제점이 있다. 같은 시간에 락을 걸려고 하면 어떻게 될까? 두 스크립트는 서로 경쟁하여 그 둘 중 어느 스크립트가 락을 얻을지 알 수 없고, 또 다른 문제가 발생한다. 이 문제는 DBMS를 사용하면 해결할 수 있다.

반응형
Comments