#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-е издание (Котерова):
Комментариев нет:
Отправить комментарий