Проверить, заблокирован ли файл с помощью flock()?

У меня есть файл, в который я пишу, но мне нужно сначала заблокировать его (используя flock()), чтобы любой другой скрипт не записывал в него. Так что я:

$file=fopen($file_p);

if (flock($file, LOCK_EX)) {//lock was successful
    fwrite($file,$write_contents);          
}

Но мне нужно проверить, не заблокирован ли он, чтобы другие сценарии не могли писать в него.

Как я могу это сделать?

3 ответа

Решение

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

if (!flock($file, LOCK_EX)) {
    throw new Exception(sprintf('Unable to obtain lock on file: %s', $file));
}

fwrite($file, $write_contents);

Как описано в документации, используйте LOCK_NB предпринять неблокирующую попытку получить блокировку, а при ошибке проверьте $wouldblock аргумент, чтобы увидеть, если что-то еще удерживает блокировку.

if (!flock($fp, LOCK_EX|LOCK_NB, $wouldblock)) {
    if ($wouldblock) {
        // something already has a lock
    }
    else {
        // couldn't lock for some other reason
    }
}
else {
    // lock obtained
}

Ваш стая вызов проверить, если он уже заблокирован. Если он заблокирован, то оператор if() потерпит неудачу, поэтому вы можете просто добавить к нему еще что-то вроде:

if (flock($file, LOCK_EX)) {//lock was successful
    fwrite($file,$write_contents);
} else {
    echo "$file is locked.";
}
Другие вопросы по тегам