flock

(PHP 4, PHP 5, PHP 7, PHP 8)

flockÖneri niteliğinde taşınabilir dosya kilitleme

Açıklama

flock(resource$akım, int$işlem, int&$engellensin = null): bool

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.

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+');


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.

To Top