2015-01-13 6 views
0

웹 응용 프로그램이 있는데 사용자가 저장을 클릭하면 파일에 쓰기가 발생합니다. 응용 프로그램은 "풋볼 스케줄러"이므로 하나 이상의 플레이어가 동시에 저장 버튼을 클릭 할 수 있습니다.둘 이상이 파일에 씁니다.

처음에는 이것이 드문 경우라고 생각했지만 발표 된 플레이어의 경기가 급하게 시작될 때부터 짧은 시간 내에 경기가 끝나기 때문에이 경우가 아닙니다.

두 명의 플레이어가 동시에 save를 누르면 어떻게됩니까? 한 플레이어의 저장 만 적용되고 다른 플레이어의 저장은 손실됩니다 (그리고 이것이 가능한 마지막 위치에서 발생하고 충돌이있는 경우는 드물지 않습니다).

이 현상에 어떻게 대처할 수 있습니까? 이


나는이 데이터베이스를 사용하지 않고 할 수 있는지 알고 싶습니다

을 필요하지 이후

// 코드를 제거했습니다. 따라서 무응답도 허용됩니다.

+0

대신 데이터베이스를 사용하는 것이 어떻습니까? – adeneo

+0

데이터베이스를 사용하지 않고 이것이 가능한지 알고 싶습니다. :) – gsamaras

+0

당신은 저장을 추가 전용으로 만들 수 있으며 액세스하려면 파일 끝에서부터 시작하여 쿼리를 수행하기에 충분한 정보를 찾을 때까지 읽습니다. 그런 식으로 두 플레이어가 같은 시간에 저장하더라도 두 데이터가 모두 저장되므로 필요할 때 조정할 수 있습니다. 추가 전용 파일 IO는 DB보다 훨씬 빠르며 매우 빠릅니다. – dandavis

답변

2

데이터베이스와 동일한 방식으로 처리 할 것이라고 가정합니다. 파일에 잠금을 추가하고 기다리십시오. 같은

뭔가 :

while (file_exists('file.lock')) { 
    usleep(10000); 
} 
touch('file.lock'); 
... 
unlink('file.lock'); 

당신은 시간 제한을 추가 할 수 있습니다. 나는 이것이 충분히 안전하다고 생각 하겠지만, 두 명의 사용자가 동시에 이것을 정확하게 실행할 수 있다고 생각합니다. 이 경우 계속하기 전에 내용이 성공적으로 저장되었다는 확인을 추가 할 수 있습니다.

업데이트 : 마크 B가 지적했듯이 파일 잠금은 PHP에 포함 된 것 같습니다. flock()을 지적하기 전까지는이 기능에 대해 알지 못했습니다.

$fp = fopen("file", "r+"); 

// try to acquire an exclusive lock, otherwise sleep 10ms before trying again 
while (!flock($fp, LOCK_EX)) { 
    usleep(10000); 
} 

fwrite($fp, "Write something here\n"); 
fflush($fp);   // flush output before releasing the lock 
flock($fp, LOCK_UN); // release the lock 

fclose($fp) 

이것은 위에서 쓴 기능과 비슷합니다. 물론 fwrite에주의를 기울이지 마십시오. php.net에서 예제를 복사하여 flock()이 어떻게 작동하는지 보여줍니다.

+0

나는 그것을 얻지 않는다. 파일이 항상 존재하므로 일정이 일치하지 않습니다. – gsamaras

+0

다른 사람이 주 파일을 열었 음을 나타 내기 위해 잠금 파일을 만듭니다. 파일을 열기 전에 잠금 파일을 확인합니다. – Devon

+0

1 대신에 4 개의 동기화 파일 IO를 사용하면 파일 액세스 지연과 관련된 문제를 해결할 수 있습니다. – dandavis

0

같은 파일에 동시에 쓸 수 없습니다.

동시에 둘 이상의 액세스를 처리 할 수있는 데이터베이스를 사용할 수 있습니다. 제 생각에 이것은 많은 데이터를 처리하고 액세스하기위한 최상의 솔루션입니다!

또는 특정 폴더에 모두 만들어진 별도의 사용자를 위해 별도의 파일에 데이터를 저장할 수 있으며 더 많은 파일을 사용할 수 있으면 하나씩 저장하고 나중에 삭제할 수 있습니다. 그런 다음 더 이상 사용할 수 없게 될 때까지 masterfile에 계속 기록하십시오. 이것은 해결책이 될 것이고 나는 그것을 정말로 추천하지 않을 것이다. 그러나 어쨌든 당신이 정말로 데이터베이스를 사용하고 싶지 않다면 그것은 효과가 있어야한다.

+0

제 질문에서 알 수 있듯이 데이터베이스를 사용하지 않으려합니다. – gsamaras

관련 문제