Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件处理程序被垃圾收集后,PHP是否关闭文件?_Php_File Io - Fatal编程技术网

文件处理程序被垃圾收集后,PHP是否关闭文件?

文件处理程序被垃圾收集后,PHP是否关闭文件?,php,file-io,Php,File Io,如果我有一个打开文件并读取一行的短函数,我需要关闭文件吗?或者当执行退出函数并且垃圾回收了$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(

如果我有一个打开文件并读取一行的短函数,我需要关闭文件吗?或者当执行退出函数并且垃圾回收了
$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));
}

现在这当然是理论上的,因为这段代码没有任何错误处理。

是的。资源超出范围时会自动释放。也就是说:

<?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();

?>

fopen()返回后,文件句柄将立即释放,因为这里没有捕获句柄的内容。

是的,但最好在使用完文件指针后立即关闭它们。这样,如果您有另一个应用程序需要对该文件进行写访问,它可以正常运行


需要研究的是PHP5.3及更高版本中的功能。

一旦删除对资源的所有引用,PHP就会自动运行资源析构函数

由于PHP有一个基于引用计数的垃圾收集,您可以相当肯定,只要
$fh
超出范围,这种情况就会尽早发生


在PHP5.4之前,如果您试图关闭分配了两个以上引用的资源,fclose实际上没有做任何事情。

“自动发布”可能意味着很多事情。只是记忆被清理了吗?还是所有拆卸代码都能安全执行?php是如何做到这一点的,以及它到底做了什么?有趣的是,
close
是如何在open之后出现在
之前的,这对于引用计数来说并不奇怪。由于fopen的返回值没有存储在任何地方,因此只要fopen调用返回,file对象就没有引用,因此file对象会立即被垃圾回收。@cleong非常感谢您提供答案的实际证据!:-)在我看来,在处理完文件后显式关闭文件句柄,而不是依赖GC来完成这项工作,这是一个很好的做法。根据我对Php的经验,我选择了最具防御性的方法。关闭文件。不要相信php。它并不能真正解决您的问题,但您希望在fopen中包含一个文件模式,用于描述您对文件的意图(例如只读)。我担心如果文件是以读/写方式打开的,并且在完成时没有关闭资源,文件锁可能会挂起一段时间(直到对象被释放)@Samuel很好,PHP实际上需要文件模式。这表明您应该始终首先运行代码:)就我个人而言,当人们将没有任何实际好处的操作描述为“良好实践”时,我总是觉得很奇怪。这是否有文档记录?如果我有一个指针由于任何原因而保持打开状态,PHP会清除它吗?考虑下面的(PHP7语法)函数MyPrPRNG(int $ $ 32){static $FP;如果($FP){$FP= fOpen['/DEV/ururOM,'R' ];} CNT= MAX(32,INTVAL($CNT)??0);$out=FRAAD($FP,$CNT);返回$out;}假设我们声明文件指针静态,当脚本执行终止时,PHP会清除$fp而不是传递给函数吗?我很想知道,这段时间我一直认为我必须用fclose()在其_destruct()方法中将资源包装在一个类中,以确保文件描述符不会泄漏@sectus应该将其添加到fclose()文档页面,IMO.@Jesse,只需添加评论,或编辑原始答案:^)
before open
open dummy://hello
close
after open