(PHP 4, PHP 5, PHP 7, PHP 8)
flock — Öneri niteliğinde taşınabilir dosya kilitleme
$akım
, int $işlem
, int &$engellensin
= null
) : boolflock() işlevi, sanal olarak her platformda (çoğu Unix türevi yanında Windows da dahil) kullanılabilen basit bir okuma/yazma modeli oluşturmanızı mümkün kılar.
PHP 5.3.2 öncesinde, kilit, fclose() işlevi ile serbest bırakılırdı (ayrıca, betik sonlandığında otomatik olarak çağrı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.
akım
Bir dosya tanıtıcısı. Genellikle fopen() kullanılarak oluşturulur.
işlem
işlem
şunlardan biri olabilir:
LOCK_SH
.
LOCK_EX
.
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ü değiştirgeye 1 atanır (EWOULDBLOCK errno kuralı).
Başarı durumunda true
, başarısızlık durumunda false
döner.
Ö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);
?>
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+" değiştirgeleri 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.
Ardıl kodda akım
değiştirgesine başka bir değer
atanması kilidin serbest kalmasına sebep olur.
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.