PHP ve eşzamanlı dosya erişimi

4 Cevap php

Ben bir düz metin dosyasındaki bazı bilgileri depolayan PHP küçük bir web uygulaması inşa ediyorum. Ancak, bu metin dosyası zamanında verilen bazı noktada benim app tüm kullanıcılar tarafından değiştirilebilir ve aynı zamanda mümkün / kullanılır.

Yani sorular. Ne sadece tek bir kullanıcı zaman içinde herhangi bir noktada dosyada değişiklik yapmak emin olmak için en iyi yol olacağını?

4 Cevap

Siz dosya üzerinde bir kilit koymak gerekir

<?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);

?>

http://www.php.net/flock bir göz atın

Benim önerim SQLite kullanmaktır. Bu, hızlı, hafif bir dosyada saklanır, ve eşzamanlı değişiklikler yapılmasını önlemek için mekanizmaları vardır. Eğer hazır bir dosya biçimi ile uğraşıyoruz sürece, SQLite gitmek için yoludur.

Aksi takdirde muhtemelen dosya şu anda düzenlenemez ya da olup olmadığını izler, tek bir (küresel) erişim noktasını uygulamak gerekir - birçok kullanıcı için tek bir dosya gerçekten sanmıyorum kullanmak strateji olmamalı. Ben bir veritabanı (bir tam dışarı katlı RDBMS yükünü istemiyorsanız SQLite) kullanmak Nobody önerisi 'ile gitmek istiyorum vb kilidi serbest, sizin değişiklik yapmak, bir kilit aquire

Sen wikipedia yapar çeşit nasıl formatında bir taahhüt günlük tür yapabilirdi.

Bir veritabanı kullanın ve her kaydedilen değişim bir artan değeri ile, önceki rekor gereksiz kılan, veritabanında yeni bir satır oluşturur, o zaman sadece kaydetme aşamasında tablo kilitleri alma hakkında endişelenmenize gerek.

Eşzamanlı 2 kişi bir şey düzenlemek için ne varsa o yolu, en az, hem de değişiklikler tarihinin görünecek ve ne olursa olsun bir yeni revizyonu içine kopyalanabilir işlemek savaşa kaybetti.

Bir veritabanını kullanmak istemiyorsanız Şimdi, o zaman her görünür dosyayı destekleyen bir revizyon kontrol dosyası sahip hakkında endişelenmenize gerek.

Sen, dosya sistemi üzerinde bir revizyon kontrolü (GIT / Mercurial / SVN) koymak ve daha sonra kaydedin aşamasında kaydedilmesini otomatikleştirebildiğiniz

Pseudocode:

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

2 kişi aynı anda kritik kaydedilmesini yapmak, en azından bu şekilde, kaybolacağım ne.