2014-04-07 6 views
2

php가 flock()을 사용하여 파일에 대한 배타적 잠금을 얻은 다음 pcntl_fork를 사용하여 두 프로세스로 분할하는 경우 두 프로세스 모두 동일한 독점 잠금을 가짐 - 즉 flock ($ fd , LOCK_EX)는 true를 반환합니다.PHP는 독점 잠금이 동일한 두 개의 프로세스를 어떻게 처리합니까?

그러나 flock을 사용하면 두 프로세스가 같은 파일에 동시에 쓰는 것을 방지 할 수 있습니다. 그러면 PHP가이 사건을 어떻게 처리합니까? 어떻게 든 배타적 인 잠금을 가진 두 프로세스가 충돌 할 수 있습니까? 한 프로세스가 다른 프로세스가 잠금을 해제했는지 여부를 감지 할 수있는 방법이 있습니까?

이것은 주로 학문적 인 호기심입니다. 나는 이것이 새로운 파일 핸들러를 만들거나 IPC를 사용하여 다른 프로세스에 알려주는 최후의 수단으로써 처리 될 수 있다는 것을 알고 있지만, 잠금의 중복을 탐지하기 위해 무리 시스템에 내장 된 방법이 있는지 궁금하다. 각 사람이 동일한 자원의 사본을 가지고 있기 때문에 잠금을해야합니다 모두 프로세스를 포크 할 때 있도록

답변

1

flock은 (fopen 수준에 의해 반환 된 파일 핸들 자원에, PHP의 측면에서) 파일 핸들 수준에서 작동합니다.

flock은 파일 핸들을 다른 프로세스와 공유하지 않는 한 동시 액세스를 방지하기위한 것입니다. 공유는 실질적인 문제가 아니기 때문에 자발적으로 운영되기 때문에, 공유한다면 독점권을 유지할 수 있도록 추가 준비를해야합니다.

학문적으로, 커널이 인 경우을 포크 후에 찾을 수 있지만 (결국, 잠금 항목이 연결된 열린 파일 설명자가 있음을 알고 있습니다.) 구현하면 그것에 대해 무언가를하는 것은 불가능합니다.