PHP – Dosya İşlemlerinde Atomic Lock

Bazı durumlarda txt vb. dosyalara kullanıcıdan alınan bilgilerin basılması gerekebiliyor. Ama bu işlemlerde de başka bir problem ortaya çıkıyor.

1. kullanıcı dosyadaki (yazma veya okuma) işlemini bitirmeden, 2. kullanıcı o dosyada herhangi bir işlem yapmamalı. Çünkü veri karmaşası olabilir.

Bu durumda atomic lock (atom kilidi) yöntemi kullanılmalı. PHP’de bu işlem için flock fonksiyonu bulunuyor.

Hemen örnek kodlara bakalım.

birinci.php

$dosya = fopen('test.txt', 'a+');

if(flock($dosya, 2)){
    for($i=0;$i<=5;$i++){
        fwrite($dosya, "birinci dosya calisti\n");
        sleep(2);
    }
}
else
    echo 'Dosya kilitlenemedi';

flock($dosya, 3);
fclose($dosya);

ikinci.php

$dosya = fopen('test.txt', 'a+');

if(flock($dosya, 2)){
    fwrite($dosya, "ikinci dosya calisti\n");
}
else
    echo 'Dosya kilitlenemedi';

flock($dosya, 3);
fclose($dosya);

Şimdi birinci.php dosyasının çalışması ~10 saniye sürecektir. Tam çalıştığı sırada (10 saniyelik süre içinde) ikinci.php‘yi çalıştırırsanız, sırasını bekleyip birinci.php‘nin test.txt dosyasını salıvermesini bekleyecektir. Çünkü test.txt dosyası birinci.php tarafından kilitlenmiştir.

flock fonksiyonundaki rakamsal değerler şu anlama gelir:

1: Okurken kilitleme.
2: Yazarken kilitleme
3: Okuma veya yazma farketmeksizin kilit kaldırılır.

Not: 3 değerini çalıştırmasanız dahi birinci.php‘nin çalışması bitince test.txt dosyasının kilidi kaldırılıp ikinci.php çalışacaktır (5.3.2’den sonraki sürümler için). Ancak performans için 3 değerini işiniz bitince yollamanızı öneririm.

 
1 Kudos
Don't move

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>