Страницы

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

суббота, 15 февраля 2020 г.

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

#php


Приветствую. Мне нужно сделать следующее:


Прочитать содержимое файла.
Удалить файл.


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

Вот фрагмент кода:

$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() другой скрипт ведь может что-то записать в файл.
    


Ответы

Ответ 1



Просто закрывать и разблокировать файл, которого уже нет А он ещё есть в действительности. И будет доступен его открывшим приложениям всё время, пока на него есть открытые ссылки. И только когда закроется последний открытый дескриптор файл пропадёт (и то пропадёт только когда ФС скомандует 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

Ответ 2



Есть еще из книги PHP5 2-е издание (Котерова):

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

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