Okuyun ve kilit tutarken bir dosyaya yazmak

3 Cevap php

Ben bir dosyada geçerli saymak saklayarak basit bir sayfa yükleme sayacını yapıyorum. Bu ben bunu yapmak istiyorum nasıl:

  1. Dosyayı kilitlemek (kümes)
  2. Geçerli saymak Oku (fread)
  3. Bunu artırmak (+ +)
  4. Yeni sayılmasını yaz (fwrite)
  5. Dosya kilidini / kapatın (flok / fclose)

Bu kilidi kaybetmeden yapılabilir mi?

Anladığım kadarıyla, dosya kilidini kaybetmeden yazılı olamaz. Bu mücadele ile gelmiş tek yolu, "r +" modunu kullanarak bir karakter yazmak, ve sonra karakterleri sayma etmektir.

3 Cevap

Dediği gibi, Flock kullanabilirsiniz. Basit bir örnek olacaktır:

//Open the File Stream
$handle = fopen("file.txt","r+");

//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
    $count = fread($handle, filesize("file.txt"));    //Get Current Hit Count
    $count = $count + 1;    //Increment Hit Count by 1
    ftruncate($handle, 0);    //Truncate the file to 0
    rewind($handle);           //Set write pointer to beginning of file
    fwrite($handle, $count);    //Write the new Hit Count
    flock($handle, LOCK_UN);    //Unlock File
} else {
    echo "Could not Lock File!";
}

//Close Stream
fclose($handle);

Sana flock kullanarak bunu başarabilirsiniz inanıyorum. Dosyanıza bir işaretçi açın, flock o, veri okumak, veri yazma, sonra close (kapat kilidi otomatik olarak açılır).

http://php.net/flock

Evet, ftruncate önce geri sarma kullanmak zorunda. Aksi halde, dosyanın eski içeriği yalnızca sıfır ile doldurulmuş.

Çalışma sırası:

    fopen
    flock LOCK_EX
    fread filesize
    rewind
    ftruncate 0
    fwrite 
    flock LOCK_UN
    fclose