2

ファイル ハンドル変数を上書きしても、新しいファイルを開くたびにファイル ハンドルを閉じる必要がありますか?

例えば:

$fp = fopen("example.txt", 'w');
$fp = fopen("example.html", 'w');// is the file handle to example.txt closed now?
fclose($fp);

ループ内にいくつかのファイルを作成していますが、ループ内のすべてのファイルのハンドルを閉じる必要があるか、ループが終了した後に 1 回閉じる必要があるかを考えています。

4

2 に答える 2

2

初期ハンドルへのメモリが解放されると、システムポインタをクリーンアップして閉じる場合があります。次のスクリプトを使用します。

$fp = fopen("example.txt", 'w');
$fp = fopen("example.html", 'w');

while (true);

私はから次の出力を取得しますinotifywait -m -r .

MODIFY example.txt
OPEN example.txt
MODIFY example.html
OPEN example.html
CLOSE_WRITE,CLOSE example.txt

これは、明示的なfcloseonがない場合、スクリプト実行の最後に開いているハンドルを閉じるのと同じ方法で(つまり、参照カウントexample.txtによって) 、ZendEngineによって暗黙的に閉じられることを意味します。

ただし、特にユースケースを考えると、ファイルハンドルを適切かつ明示的に閉じることをお勧めします。ここでは、ループ内で複数のファイルハンドルを開くことによるメモリへの影響について十分に懸念する必要があります。それに加えて、実行時間の長いスクリプトでファイルのロックを取得する可能性のある問題、セキュリティ上の考慮事項、ハンドルを適切にクリーンアップすることをお勧めします。

参照:PHPでファイルに書き込んだ後に必要なのはなぜですか?fclose

于 2013-02-19T20:28:42.097 に答える
0

あなたが呼び出すまで、ファイルハンドルはまだ開いていますfclose()

変数を上書きするだけで、以前のハンドルへの参照が失われます。それらを制御する必要がある場合は、別の変数に割り当てます。

また、ガベージ コレクターは通常、参照のないオブジェクトをメモリから削除する必要がありますが、常にそうなるとは限りません。

于 2013-02-19T20:07:47.240 に答える