覆盖文件句柄而不使用fclose()导致的缺点?

时间:2013-02-19 20:02:46

标签: php fopen file-handling fclose

每次打开新文件时是否需要关闭文件句柄,尽管我会覆盖文件句柄变量?

e.g:

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

我正在循环中创建几个文件,我想是否需要关闭循环内的每个文件的句柄或循环结束后的一次。

2 个答案:

答案 0 :(得分: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

这意味着在fclose上没有明确的example.txt,Zend引擎无论如何都会隐式关闭它,就像在脚本执行结束时关闭一个打开的句柄一样(即reference-counting)。

但是,我仍然会建议您正确并明确地关闭所有文件句柄,特别是考虑到您的用例 - 在循环中打开多个文件句柄的内存含义应该足够关注。再加上长期运行脚本的任何问题可能会抓住文件上的锁,安全性考虑因素,最好正确清理句柄。

另请参阅:Why do I need fclose after writing to a file in PHP?

答案 1 :(得分:0)

在您致电fclose()

之前,文件句柄仍将处于打开状态

您所做的就是覆盖变量,丢失对前一个句柄的任何引用。 如果您仍需要控制它们,请将它们分配给不同的变量。

垃圾收集器通常必须删除没有内存引用的对象,但这并不总是发生。