2017-09-07 10 views
0

아래 코드에서 볼 수 있듯이 다른 클라이언트가 PHP를 액세스하지 못하도록 막으려 고합니다 (실제로 여러 사용자가 초당 시간, 각 하나씩), 여기에서 검색을 찾았습니다 ... 그러나 이것은 작동하지 않습니다. 내 data.txt이 때마다 비어지고있다.PHP 읽는 동안 파일 잠금 - flock() 내 파일이 비어있게합니다

<?php 
$fileName = $_GET["room"]."/data.txt"; 

function replaceLine($data){ 
    if (stristr($data, $_GET["player"])){ 
     return $_GET["player"]." ".$_GET["data"]."\n"; 
    } 
    return $data; 
} 

$file = fopen($fileName,"r"); 

if (flock($file, LOCK_EX)){ 
    //ftruncate($file, 0); 
    ///-------------- 

    $data = file($fileName); 
    $data = array_map("replaceLine", $data); 
    file_put_contents($fileName, implode('', $data)); 

    echo fread($file, filesize($fileName)+1); 

    ///-------------- 
    fflush($file); 
    flock($file, LOCK_UN); 
} else { 
    echo "wait"; 
} 

fclose($file); 

?> 

이 (내가 빈 파일 만들기 방지하기 위해 수정하려고되었다) 원래의 코드입니다 : (내가 원하는대로 작동을하지만,이 파일에 문제가 ...)

<?php 
$fileName = $_GET["room"]."/data.txt"; 

function replaceLine($data){ 
    if (stristr($data, $_GET["player"])){ 
     return $_GET["player"]." ".$_GET["data"]."\n"; 
    } 
    return $data; 
} 

$data = file($fileName); 
$data = array_map("replaceLine", $data); 
file_put_contents($fileName, implode('', $data)); 

$file = fopen($fileName,"r"); 
echo fread($file, filesize($fileName)+1); 
fclose($file); 

?> 

이 초보자 질문에 대해 유감스럽게 생각합니다. 그러나이 문제를 해결하는 방법을 모르고 있으며 수 주일 동안 여러 가지를 찾고 있습니다. 감사!

+0

$ 데이터가 비어 있지 않은 것으로 확인하셨습니까? –

답변

1

파일을 읽기 전용으로 연 다음 해당 파일에 쓰려고합니다. fopen 매개 변수를 읽기/쓰기로 설정하십시오.

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

나는 대신에 file_put_contents를() 이미 파일 포인터 개방이 있기 때문에 그것을 다시 가능성이 잠금에 의해 거부됩니다의에 fwrite()를 사용합니다.