PHP 5.x syncronized dosya erişimi (veritabanı yok)

2 Cevap php

Ben sadece bir iplik herhangi bir zamanda bir kaynağa erişen olduğunu kontrol etmek için yolu vardır + + olan Java, C ve C çoğunlukla aşina değilim. Şimdi benzer bir şey için arama ancak PHP 5.x değilim

Bir örnek ile benim sorunu formüle etmek:

Ben sadece bir sayı, bir sayfa yükleme sayacın değerini saklayan bir ASCII dosyası var. Uygulama dağıtımı de dosya sadece 0 yapacak. Her erişimi için değeri bir artırılır. Hedef sayfa yük takip etmektir.

Birçok kullanıcı eş zamanlı sayaç içeren sayfayı erişirken sorun gelir. Parçacığı A akım değeri okuduğunda, şunu, biz B hala, 11 değerini okur diyoruz. Sonra ilk iplik bir okuma değerini artırır ve dosyada 12 yazar ve kapatır başka bir iş parçacığı 11 diyelim. Sonra ikinci iplik B, 11 yaşındayken okuma değerini artırır 12 alır ve bu dosya içine yazar. Gerçekten 13 olmalıydı değeri 12, dosyasında saklanır.

Başka bir programlama dilinde bir Muteksleri kullanarak bu sorun çözülmüş olurdu. Ben muteksler, paylaşımlı bellek ve modüllerinin bir parçası olarak diğer fonksiyonelliğini vardır anlamak. Ama ben orada "en sunucularında" üzerinde çalışan bir çözüm istiyorum. Bağımsız bir platform. En ucuz web host üzerinde kurulu. Bu soruna iyi bir çözüm var mı? Yoksa ve hangi yolu götürecek bir database is not an option kullanıyorsanız?

2 Cevap

Sen (http://www.php.net/flock) sürünün php varyantını deneyebilirsiniz

Ben benzer bir şey (bu dosya / tmp / counter.txt zaten var ve dosyada bir sayaç var olduğunu varsayar) hayal ediyorum:

<?php

$fp = fopen("/tmp/counter.txt", "r+");

echo "Attempt to lock\n";
if (flock($fp, LOCK_EX)) {
  echo "Locked\n";
  // Read current value of the counter and increment
  $cntr = fread($fp, 80);
  $cntr = intval($cntr) + 1;

  // Pause to prove that race condition doesn't exist
  sleep(5);

  // Write new value to the file
  ftruncate($fp, 0);
  fseek($fp, 0, SEEK_SET);
  fwrite($fp, $cntr);
  flock($fp, LOCK_UN); // release the lock
  fclose($fp);
}

?>

PHP'nin flock () işlevi gitmek için yol olduğunu. Ancak, emin all dosyasına erişen ilk akın çağrısı () tarafından korunduğunu yapmak zorunda. Açıkça çağrı bunu yaptığınız sürece dosya kilitli olup olmadığını kontrol PHP olmaz.

Kavramı muteksler (paylaşılan kaynakları, ark koruma) ile hemen hemen aynıdır, ama özel bir önem taşıyabilecek kadar önemlidir.