2016-06-08 2 views
0

Я пытаюсь простой алгоритм, который говорит:PHP блок файла от чтения

File1: (lock.php)

  • Открыть файл
  • Блокировка файла, так что никакой другой PHP файл может прочитать эту
  • Sleep
  • релиз Замок

File2: (lockstatus.php)

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

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

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?

ответ

2

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

1

Эта функция flock() имеет другое поведение в linux и windows.

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

flock on PHP Docs

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

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

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

+0

Я использую Linux. Поэтому, я думаю, это должно работать в моем случае. И сделал это «r +», однако это не сработает. –

+0

Взгляните на первый комментарий к документам: «Функция flock следует за семантикой системного вызова Unix с тем же именем. Flock использует только блокировку ADVISORY, то есть другие процессы могут полностью игнорировать блокировку, она затрагивает только те, которые позвоните в звонок стада ». –

Смежные вопросы