fopen — файл блока PHP для чтения

Я пытаюсь простой алгоритм, который говорит:

Файл1: (lock.php)

  • Открыть файл
  • Заблокируйте файл, чтобы никакой другой PHP-файл не мог прочитать это
  • Спать
  • Снять блокировку

Файл2: (lockstatus.php)

  • Попробуйте открыть файл.
  • Если не открывается
    • Подождите, пока Lock отпустит
  • еще
    • Читать файл

Моя реализация кода:

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?

0

Решение

Проблема в том, что flock() только обеспечивает консультативную блокировку. Другая программа может полностью игнорировать это и переходить к fopen и fread или как-то еще. Ключ должен использовать flock в вашем Lockstatus.php, а также после того, как вы делаете fopen проверить, существуют ли существующие блокировки. flock в Lockstatus.php произойдет сбой, и тогда вы узнаете, что существует существующая блокировка.

2

Другие решения

Эта функция flock () по-разному работает в Linux и Windows.

Внимательно изучите «Примечания» по PHP документам. Это может быть вашей проблемой.

стекаются на PHP Docs

После этого обратите внимание на параметр r +, он обязателен для чтения + блокировки.

$fp = fopen('/tmp/lock.txt', 'r+');

Это не будет работать с .

1

По вопросам рекламы [email protected]