2

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

例如:

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

我在一个循环内创建了几个文件,我考虑是否需要关闭循环内每个文件的句柄,或者在循环完成后关闭一次。

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

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

但是,我仍然建议您正确且明确地关闭任何文件句柄,特别是考虑到您的用例 - 在循环中打开多个文件句柄的内存影响应该足以引起关注。再加上长时间运行的脚本可能会锁定文件,安全考虑的任何问题,最好正确清理句柄。

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

于 2013-02-19T20:28:42.097 回答
0

文件句柄将仍然打开,直到您调用fclose()

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

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

于 2013-02-19T20:07:47.240 回答