如果我有一个打开文件并读取一行的短函数,我是否需要关闭该文件?或者,当执行退出函数并且$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));
}
这当然是理论上的,因为此代码没有任何错误处理。
答案 0 :(得分:14)
只要删除对该资源的所有引用,PHP就会自动运行资源析构函数。
由于PHP具有基于引用计数的垃圾收集,因此只要$fh
超出范围,就可以尽可能早地确保这种情况发生。
在PHP 5.4 fclose
之前,如果您尝试关闭分配了两个以上引用的资源,则实际上没有做任何事情。
答案 1 :(得分:11)
是。资源超出范围时会自动释放。即:
<?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();
?>
输出:
before open
open dummy://hello
close
after open
一旦fopen()返回,文件句柄就会被释放,因为这里没有任何东西可以捕获句柄。
答案 2 :(得分:4)
是的,但最好在完成后立即关闭文件指针。这样,如果您有另一个需要对该文件进行写访问的应用程序,它可以正常运行。
需要研究的是PHP 5.3及更好的Garbage Collection功能。