2012-11-04 112 views
0

我有一個存儲某個值的文件。用戶可以將文件添加到該文件,並更新該文件中的計數器。但是如果兩個用戶打開文件,他們會得到相同的計數器($arr['counter'])。我該怎麼辦?也許我可以鎖定一個用戶的文件,並在他更新計數器並添加一些東西迴文件後釋放鎖定?或者PHP已經鎖定文件一旦打開,我不必擔心?這裏是我當前的代碼:在讀寫時鎖定文件

$handle = fopen($file, 'r'); 
    $contents = fread($handle, filesize($file)); 
    fclose($handle);  

    $arr = json_decode($contents); 

    //Add stuff here to $arr and update counter $arr['counter']++ 

    $handle = fopen($file, 'w'); 
    fwrite($handle, json_encode($arr)); 
    fclose($handle);  
+1

這是這種東西會通常與一個序列進行對象在關係數據庫中。 – Wyzard

回答

0

PHP有flock功能,將寫它,例如前鎖定文件,

$handle = fopen($file, 'r'); 
$contents = fread($handle, filesize($file)); 
fclose($handle);  

$arr = json_decode($contents); 

//Add stuff here to $arr and update counter $arr['counter']++ 

$handle = fopen($file, 'w'); 
if(flock($handle, LOCK_EX)) 
{ 
    fwrite($handle, json_encode($arr)); 
    flock($handle, LOCK_UN);   
} 
else 
{ 
    // couldn't lock the file 
} 
fclose($handle); 
+0

我在讀取文件之前也需要鎖定,因爲我不希望兩個用戶都有相同的計數器。 –

+0

@hey我會考慮在這裏做這個愚蠢的事情,因爲可能有更好的方式(閱讀:數據庫),但是如果你真的想看到鎖需要獲取的時間/地點(以及必須發生同步時),請閱讀SQLite鎖定文檔。 – 2012-11-04 19:09:12

+0

@pst:爲什麼它很糟糕? –