Страницы

Поиск по вопросам

четверг, 25 апреля 2019 г.

Когда правильно закрывать файл и снимать блокировку?

Приветствую. Мне нужно сделать следующее:
Прочитать содержимое файла. Удалить файл.
При этом файл не должен быть доступен для записи до тех пор, пока мы не закончим чтение и не удалим файл.
Вот фрагмент кода:
$h = fopen(__DIR__.'/file.txt', 'r+'); flock($h, LOCK_EX); $str = file_get_contents(__DIR__.'/file.txt'); unlink(__DIR__.'/test.txt'); flock($h, LOCK_UN); fclose($h);
Правильно ли так писать? Просто закрывать и разблокировать файл, которого уже нет выглядит не очень корректно... А если удалять уже после разблокировки и вызова fclose(), то в промежутке между fclose() и unlink() другой скрипт ведь может что-то записать в файл.


Ответ

Просто закрывать и разблокировать файл, которого уже нет
А он ещё есть в действительности. И будет доступен его открывшим приложениям всё время, пока на него есть открытые ссылки. И только когда закроется последний открытый дескриптор файл пропадёт (и то пропадёт только когда ФС скомандует trim либо переиспользует блоки под что-нибудь другое).
melkij@melkij:~$ echo 42 > tmp/rmfile melkij@melkij:~$ php -a Interactive mode enabled
php > $fp = fopen('tmp/rmfile', 'r+'); php > unlink('tmp/rmfile'); php > echo fread($fp, 100); 42 php > var_dump(file_exists('tmp/rmfile')); bool(false)
Эта особенность, кстати, иногда может помочь восстановить случайно удалённый файл чтением открытого дескриптора из /proc/$PID/fd

Комментариев нет:

Отправить комментарий