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


Overwrite file handle without using fclose() resulting drawback?

虽然覆盖了文件句柄变量,但每次打开新文件时是否需要关闭文件句柄?

例如:

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

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

当释放初始句柄的内存时,系统可能会清理指针并关闭它

$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

这意味着,在example.txt上没有显式fclose的情况下,Zend引擎无论如何都会隐式关闭它,就像它在脚本执行结束时关闭打开的句柄一样(即通过引用计数)。

但是,我仍然建议您正确而明确地关闭任何文件句柄,特别是考虑到您的用例-在循环中打开多个文件句柄对内存的影响应该足够令人担忧了。除此之外,如果长时间运行的脚本可能会占用文件的锁,出于安全考虑,最好正确清理句柄。

另请参阅:在PHP中写入文件后,为什么需要fclose

在调用fclose() 之前,文件句柄仍将打开

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

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