flock
(PHP 4, PHP 5, PHP 7, PHP 8)
flock — Öneri niteliğinde taşınabilir dosya kilitleme
Açıklama
Kilit, fclose() işlevinden başka
akım
çöp toplayıcıyla toplanırken de serbest
bırakılır.
PHP, tavsiye niteliğinde dosyaların tamamını kilitlemenin taşınabilir bir
türünü destekler (yani, dosyalara erişen tüm programların dosyaları
kilitlerken aynı yöntemi kullanmaları zorunludur, aksi takdirde
kullandıkları yöntem çalışmayacaktır). Öntanımlı olarak, bu işlev istenen
kilit alınıncaya kadar bekler. Bu durum aşağıda açıklanan
LOCK_NB
seçeneği ile (Windows dışındaki platformlarda)
değiştirilebilir.
Bağımsız Değişkenler
akım
-
Bir
dosya tanıtıcısı. Genellikle fopen() kullanılarak
oluşturulur.
işlem
-
işlem
şunlardan biri olabilir:
-
Paylaşımlı bir kilit (okuyucu) edinmek için
LOCK_SH
.
-
Ayrıcalıklı bir kilit (yazıcı) edinmek için
LOCK_EX
.
-
Bir kilidi (paylaşımlı veya ayrıcalıklı) serbest bırakmak için
LOCK_UN
.
Kilitleme sırasında işlevin engelleme yapmasını istemiyorsanız
yukarıdaki işlemlerden birine bir bit maskesi olarak
LOCK_NB
eklemek mümkündür (Windows'ta
desteklenmez).
engellesin
-
Kilidin engellemesi için isteğe bağlı üçüncü bağımsız değişkene 1 atanır
(EWOULDBLOCK errno kuralı).
Dönen Değerler
Başarı durumunda true
, başarısızlık durumunda false
döner.
Örnekler
Örnek 1 - flock() örneği
<?php
$dt = fopen("/tmp/lock.txt", "w");
if (flock($dt, LOCK_EX)) { // ayrıcalıklı bir kilit elde edelim
ftruncate($fp, 0); // dosyayı kırp
fwrite($dt, "Buraya bir şeyler yazalım\n");
fflush($dt); // kilidi bırakmadan önce çıkışı temizleyelim
flock($dt, LOCK_UN); // kilidi serbest bırakalım
} else {
echo "Kilit edinilemedi!";
}
fclose($dt);
?>
Örnek 2 - LOCK_NB
kullanarak flock()
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* LOCK_EX işlemi üstünde LOCK_NB'yi etkinleştirelim */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Kilit edinilemedi';
exit(-1);
}
/* ... */
fclose($fp);
?>
Notlar
Bilginize:
flock() işlevi Windows altında zorunlu olarak kilitler.
flock(), Windows'ta tavsiye niteliğinde kilitleme yerine
zorunlu kilitlemeyi kullanır. Zorunlu kilitleme, Linux ve System V tabanlı
işletim sistemlerinde, fcntl() sistem çağrısı tarafından desteklenen olağan
mekanizma yoluyla desteklenir: yani, söz konusu dosya setgid izin bitine
sahipse ve grup yürütme biti temizlenmişse. Linux'ta, bunun çalışması için
dosya sisteminin de mand seçeneğiyle bağlanması gerekecektir.
Bilginize:
flock() işlevi bir dosya tanıtıcısı gerektirdiğinden
bir dosyayı yazmak amacıyla açarken (fopen() işlevinde
"w" veya "w+" bağımsız değişkenleri ile) içeriğini silebilmek için dosyaya
başkalarının erişimini engellemeniz, yani özel bir kilit dosyası
kullanmanız gerekir.
Bilginize:
Yalnızca yerel dosyalar için fopen() tarafından
döndürülen dosya göstericilerinde veya
streamWrapper::stream_lock() yöntemini uygulayan
kullanıcı alanı akımların dosya göstericilerinde kullanılabilir.
Uyarı
Ardıl kodda akım
bağımsız değişkenine başka bir değer
atanması kilidin serbest kalmasına sebep olur.
Uyarı
Bazı işletim sistemlerinde flock() işlevi süreç
seviyesinde gerçeklenmiştir. ISAPI gibi çok evreli bir API
kullanıldığında, dosyaları aynı sunucu örneğinin paralel evrelerinde
çalışan diğer PHP betiklerine karşı flock() üzerinden
korumak mümkün olmayabilir!
flock() işlevi, FAT
ve türevleri
gibi artık antika olmuş dosya sistemlerinde desteklenmez ve bu ortamlarda
daima false
döndürür.
Bilginize:
Windows'ta, kilitleme süreci dosyayı ikinci kez açarsa, kilit kaldırılana
kadar ikinci tanıtıcı üzerinden dosyaya erişemez.