flock
(PHP 4, PHP 5, PHP 7, PHP 8)
flock β ΠΠ»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ°ΠΉΠ» ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΠΉ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ fclose()
ΠΈΠ»ΠΈ ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ°, ΠΊΠΎΠ³Π΄Π° ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅Ρ ΠΏΠΎΡΠΎΠΊ stream.
PHP ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΠΉ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΡΠ°ΠΉΠ»ΠΎΠ². Π’ΠΎ Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°ΠΉΠ»Ρ,
Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΏΠΎΡΠΎΠ± Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΈΠ½Π°ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ
ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ,
ΠΏΠΎΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π°; ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ
ΡΠ΅ΡΠ΅Π· ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΡΠ»Π°Π³ LOCK_NB.
Π‘ΠΏΠΈΡΠΎΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
stream
-
Π Π΅ΡΡΡΡ (resource)
ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fopen().
operation
-
operation ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
-
LOCK_SH Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (ΡΡΠ΅Π½ΠΈΠ΅).
-
LOCK_EX Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (Π·Π°ΠΏΠΈΡΡ).
-
LOCK_UN Π΄Π»Ρ ΡΠ½ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΈΠ»ΠΈ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΠΉ).
Π€Π»Π°Π³ LOCK_NB Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ
ΠΊΠ°ΠΊ Π±ΠΈΡΠΎΠ²ΡΡ ΠΌΠ°ΡΠΊΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° Π²ΡΡΠ΅,
Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ flock() Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π°
Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠΏΡΡΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°.
would_block
-
ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΡΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1,
Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΉ
(Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ errno Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΠ°Π½ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ EWOULDBLOCK).
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ false, Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ flock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ
ftruncate($fp, 0); // ΠΡΠΈΡΠ°Π΅ΠΌ ΡΠ°ΠΉΠ»
rewind($fp);
fwrite($fp, "ΠΠΈΡΠ΅ΠΌ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΡΠ΄Π°\n");
fflush($fp); // ΠΡΠΈΡΠ°Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΡΠΌΠ΅Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
flock($fp, LOCK_UN); // Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ
} else {
echo "ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ!";
}
fclose($fp);
?>
ΠΡΠΈΠΌΠ΅Ρ #2 ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ flock() Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ LOCK_NB
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΎΠΏΡΠΈΡ LOCK_NB Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ LOCK_EX */
if (!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ';
exit(-1);
}
/* ... */
fclose($fp);
?>
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡ
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
Π ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
Windows ΡΡΠ½ΠΊΡΠΈΡ flock() Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ
Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ
Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
Π½Π° Π±Π°Π·Π΅ Linux ΠΈ System V
ΡΠ΅ΡΠ΅Π· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² fcntl(): ΡΠΎ Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π΄Π»Ρ ΡΠ°ΠΉΠ»Π°
ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π±ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ setgid ΠΈ ΡΠ±ΡΠΎΡΠ΅Π½ Π±ΠΈΡ Π³ΡΡΠΏΠΏΠΎΠ²ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Π§ΡΠΎΠ±Ρ ΡΡ
Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π»Π° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π² Linux, ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ
ΡΠ°ΠΊΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ mand.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ flock() ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
Π½Π° ΡΠ°ΠΉΠ», Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»
Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΡΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ ΠΎΠ±ΡΠ΅Π·Π°ΡΡ,
ΠΎΡΠΊΡΡΠ² Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π·Π°ΠΏΠΈΡΠΈ (Π² ΡΠ΅ΠΆΠΈΠΌΠ°Ρ
Β«wΒ» ΠΈΠ»ΠΈ Β«w+Β»
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ fopen()).
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°Ρ
Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²,
ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ fopen(), ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°Ρ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄
streamWrapper::stream_lock().
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅
ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ stream
Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π΄Π°Π»ΡΡΠ΅ ΠΊΠΎΠ΄Π΅ ΡΠ½ΠΈΠΌΠ΅Ρ ΡΠ΅ΠΊΡΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ.
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅
Π ΡΡΠ΄Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΡΠΈΡΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ flock() ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌΠΈ API,
Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ISAPI, Π½Π΅Π»ΡΠ·Ρ ΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ flock(),
ΡΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡ ΡΠ°ΠΉΠ»Ρ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ
PHP-ΡΠΊΡΠΈΠΏΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅
ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ΅!
Π€ΡΠ½ΠΊΡΠΈΡ flock() Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠ°ΡΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ
Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ FAT ΠΈ Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ false Π² ΡΡΠΈΡ
ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΡ
.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΡΠ»ΠΈ Π² Windows ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°Π·, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ
ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°ΠΉΠ»Ρ ΡΠ΅ΡΠ΅Π· Π²ΡΠΎΡΠΎΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ°ΠΉΠ».