(PHP 4, PHP 5, PHP 7, PHP 8)
flock — Öneri niteliğinde taşınabilir dosya kilitleme
flock() 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.
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.
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ü bağımsız değişkene 1 atanır (EWOULDBLOCK errno kuralı).
Ö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+');
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+" 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.
Ardıl kodda akım
bağımsız değişkenine 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.
Bilginize:
Windows'ta, kilitleme süreci dosyayı ikinci kez açarsa, kilit kaldırılana kadar ikinci tanıtıcı üzerinden dosyaya erişemez.