2008-11-16 9 views
10

Buduję małą aplikację internetową w PHP, która przechowuje pewne informacje w pliku tekstowym. Jednak ten plik tekstowy jest używany/modyfikowany przez wszystkich użytkowników mojej aplikacji w pewnym momencie i możliwy w tym samym czasie.Dostęp do PHP i jednoczesnego dostępu do plików

Więc pytania są. Jaki byłby najlepszy sposób upewnienia się, że tylko jeden użytkownik może wprowadzić zmiany do pliku w dowolnym momencie?

Odpowiedz

19

Należy umieścić blokadę na pliku

<?php 

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

if (flock($fp, LOCK_EX)) { // do an exclusive lock 
    fwrite($fp, "Write something here\n"); 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    echo "Couldn't lock the file !"; 
} 

fclose($fp); 

?> 

Spójrz na http://www.php.net/flock

10

Moja sugestia to użycie SQLite. Jest szybki, lekki, przechowywany w pliku i ma mechanizmy zapobiegające równoczesnej modyfikacji. Jeśli nie masz do czynienia z już istniejącym formatem plików, SQLite jest drogą do zrobienia.

2

Pojedynczy plik dla wielu użytkowników naprawdę nie powinien być strategią, której używasz Nie sądzę - w przeciwnym razie prawdopodobnie będziesz musiał zaimplementować jeden (globalny) punkt dostępu, który monitoruje, czy plik jest aktualnie edytowany lub nie. Zablokuj zamek, zrób modyfikację, zwolnij blokadę itp. Wezwałbym "Nikt nie sugerował by użyć bazy danych (SQLite, jeśli nie chcesz narzut pełnego zdejmowania RDBMS)

3

Możesz zrobić commit log format, rodzaj tego, jak działa wikipedia.

Użyj bazy danych, a każda zapisana zmiana tworzy nowy wiersz w bazie danych, co powoduje, że poprzedni rekord jest nadmiarowy, z zwiększoną wartością, wtedy musisz tylko martwić się o blokadę tabeli podczas fazy składowania.

W ten sposób, przynajmniej jeśli 2 równoczesne osoby zdarzyłyby się edytować coś, obie zmiany pojawią się w historii, a to, co straciliśmy podczas wojny zatwierdzenia, może zostać skopiowane do nowej wersji.

Teraz, jeśli nie chcesz korzystać z bazy danych, musisz się martwić o posiadanie pliku kontroli wersji, który wspiera każdy widoczny plik.

Można umieścić kontroli wersji (GIT/MERCURIAL/SVN) w systemie plików, a następnie zautomatyzować rewizje w fazie ratowania,

pseudokod:

user->save : 
    getWritelock(); 
    write($file); 
    write_commitmessage($commitmessagefile); # <-- author , comment, etc 
    call "hg commit -l $commitmessagefile $file " ; 
    releaseWriteLock(); 
done. 

Przynajmniej w ten sposób, gdy 2 osoby podejmuj krytyczne zobowiązania w tym samym czasie, ani się nie zgubisz.

Powiązane problemy