Приветствую. Мне нужно сделать следующее:
Прочитать содержимое файла.
Удалить файл.
При этом файл не должен быть доступен для записи до тех пор, пока мы не закончим чтение и не удалим файл.
Вот фрагмент кода:
$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
Комментариев нет:
Отправить комментарий