2012-10-23 5 views
4

텍스트 파일에 쓸 파일 이름과 json 객체를받는 함수가 있습니다.fopen (file, w +)은 flock()으로 잠겨 있는지 확인하기 전에 파일을 자릅니다.

개체가 업데이트되어 파일의 현재 내용을 완전히 대체해야합니다. 각 사이트 방문자는 자신의 파일을 가지고 있습니다. 여러 급격한 변경으로 인해 파일이 fopen(file,w+)으로 잘린 다음 잠긴 상태로 기록되지 않습니다. 최종 결과는 빈 파일입니다.

평범한 활동이므로 표준 방법이 있습니다. 이상적으로는 파일을 자르기 전에 fopenw+ 모드에서 모드를 전환하는 방법으로 파일을 잘라내는 방법을 찾고 있습니다.

파일 핸들을 flock()으로 전달하여 파일이 잠겼는지 확인하기 위해 fopen()으로 파일을 자르면 이상하지만 파일을 자르면 바로 그 점이 무엇입니까? 당신은 약간의 수정으로 원하는 것을 할 것입니다 PHP manual에서

function updateFile($filename, $jsonFileData) { 
    $fp = fopen($filename,"w+"); 
    if (flock($fp, LOCK_EX)) { 
     fwrite($fp, $jsonFileData); 
     flock($fp, LOCK_UN); 
     fclose($fp); 
     return true; 
    } else { 
     fclose($fp); 
     return false; 
    } 
} 
+0

왜이 용도로 데이터베이스를 사용하지 않습니까? – NullUserException

+0

이미 파일을 다루고있는 다른 프로젝트에서 프로젝트를 가져 왔습니다. 대신 데이터베이스로 작업 할 수 있도록 코드를 다시 작성할 수 있지만 다시 작업하기 전에 다른 솔루션이 있는지 확인하려고합니다. – Peter

답변

8

예 # 1 :

는 여기에 지금까지 가지고있는 기능입니다. 쓰기 위해 파일을 열려면 "c" mode을 사용하고, 파일이 없으면 파일을 만들고 파일을 자르지 마십시오. "c" mode

$fp = fopen("/tmp/lock.txt", "c"); 

if (flock($fp, LOCK_EX)) { // acquire an exclusive lock 
    ftruncate($fp, 0);  // truncate file 
    fwrite($fp, "Write something here\n"); 
    fflush($fp);   // flush output before releasing the lock 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    echo "Couldn't get the lock!"; 
} 

fclose($fp); 

전체 설명 :

열기 쓰기 파일. 파일이 없으면 파일이 작성됩니다. 존재하는 경우에는 'w'와 반대로 잘리지 않으며이 함수에 대한 호출도 실패합니다 ('x'의 경우와 같이). 파일 포인터는 파일의 시작 부분에 위치합니다. 잠금을 얻기 전에 'w'가 파일을자를 수 있기 때문에 자물쇠 잠금 (flock() 참조)을 얻으려는 경우에 유용 할 수 있습니다 (절단이 필요한 경우 ftruncate()를 사용할 수 있습니다). 잠금이 요청 됨).

당신이 필요로하는 것처럼 보이지는 않지만 읽고 쓰고 싶다면 "c+" 모드도 있습니다.