Подтвердить что ты не робот

Закрывает ли PHP файл после того, как обработчик файлов собран из мусора?

Если у меня есть короткая функция, которая открывает файл и читает строку, мне нужно закрыть файл? Или PHP сделает это автоматически, когда выполнение завершит выполнение функции, а $fh - сбор мусора?

function first_line($file) {
    $fh = fopen($file);
    $first_line = fgets($fh);
    fclose($fh);
    return $first_line;
}

можно было бы упростить до

function first_line($file) {
    return fgets(fopen($file));
}

Это, конечно, теоретически сейчас, так как этот код не имеет обработки ошибок.

4b9b3361

Ответ 1

PHP автоматически запускает деструктор ресурса, как только все ссылки на этот ресурс удаляются.

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

До того, как PHP 5.4 fclose ничего не сделал, если вы попытались закрыть ресурс, на который было назначено более двух ссылок.

Ответ 2

Да. Ресурсы выпускаются автоматически, когда они выходят за рамки. К остроумию:

<?php

class DummyStream {

    function stream_open($path, $mode, $options, &$opened_path) {
    echo "open $path<br>";
        return true;
    }

    function stream_close() {
        echo "close<br>";
        return true;
    }
}

stream_wrapper_register("dummy", "DummyStream");

function test() {
    echo "before open<br>";
    fopen("dummy://hello", "rb");
    echo "after open<br>";
}

test();

?>

Вывод:

before open
open dummy://hello
close
after open

Дескриптор файла освобождается, как только fopen() возвращает, так как здесь ничего нет, захватив дескриптор.

Ответ 3

Да, но это хорошая практика, чтобы закрыть указатели файлов, как только вы закончите с ними. Таким образом, если у вас есть другое приложение, для которого требуется доступ на запись к этому файлу, он может работать изящно.

Что-то, что нужно изучить, - это функция Garbage Collection, представленная в PHP 5.3 и выше.