21

ファイルを開いて行を読み取る短い関数がある場合、ファイルを閉じる必要がありますか? $fhまたは、実行が関数を終了し、ガベージコレクションが行われたときに、PHP はこれを自動的に行いますか?

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

次に簡略化できます

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

このコードにはエラー処理がないため、これはもちろん理論上のものです。

4

3 に答える 3

14

PHPは、そのリソースへのすべての参照が削除されるとすぐに、リソースデストラクタを自動的に実行します。

PHPには参照カウントベースのガベージコレクションがあるため、これが可能な限り早期に、あなたの場合 $fhは範囲​​外になるとすぐに発生することをかなり確信で​​きます。

PHP 5.4より前fcloseは、3つ以上の参照が割り当てられているリソースを閉じようとしても、実際には何もしませんでした。

于 2012-08-27T14:06:06.307 に答える
12

Yes. Resources are released automatically when they go out of scope. To wit:

<?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();

?>

Output:

before open
open dummy://hello
close
after open

The file handle is released as soon as fopen() returns, as there's nothing here capturing the handle.

于 2012-08-27T13:51:53.277 に答える
5

はい。ただし、ファイルポインタを使い終わったら、すぐに閉じることをお勧めします。このように、そのファイルへの書き込みアクセスが必要な別のアプリケーションがある場合、そのアプリケーションは正常に実行できます。

調べるべきものは、PHP5.3以降に存在するガベージコレクション機能です。

于 2012-08-27T13:54:28.723 に答える