Я пытаюсь простой алгоритм, который говорит:
Файл1: (lock.php)
Файл2: (lockstatus.php)
Моя реализация кода:
Lock.php:
<?php
$f = fopen("key",'a');
if (flock($f, LOCK_EX | LOCK_NB)) {
echo "File Locked. For Next 60 Seconds\n";
sleep(60);
var_dump(flock($f, LOCK_UN)); //release lock
echo "lock released";
} else {
echo "blocked";
}
?>
Lockstatus.php
<?php
do {
echo "\n";
$f = fopen("key",'a');
if ($f) {
echo "Readable\n";
fclose ($f);
} else {
echo "Blocked! I am waiting\n";
sleep(10);
}
} while (!$f); //wait until fopen does not work
?>
Проблема:
Четное, flock
применяется, Lockstatus.php
может открыть файл
Вопрос:
Как заблокировать чтение файла при Lockstatus.php
как только он заблокирован Lock.php
?
Проблема в том, что flock()
только обеспечивает консультативную блокировку. Другая программа может полностью игнорировать это и переходить к fopen и fread или как-то еще. Ключ должен использовать flock
в вашем Lockstatus.php, а также после того, как вы делаете fopen
проверить, существуют ли существующие блокировки. flock
в Lockstatus.php произойдет сбой, и тогда вы узнаете, что существует существующая блокировка.
Эта функция flock () по-разному работает в Linux и Windows.
Внимательно изучите «Примечания» по PHP документам. Это может быть вашей проблемой.
После этого обратите внимание на параметр r +, он обязателен для чтения + блокировки.
$fp = fopen('/tmp/lock.txt', 'r+');
Это не будет работать с .