为什么我需要在使用php写入文件后使用fclose($handle)
函数完成?程序结束时是否自动执行此操作?
答案 0 :(得分:13)
是。但是,最好自己动手。此外,您将在脚本的其余部分的整个执行期间保持文件处于打开状态,这是您应该避免的。因此,除非您的脚本在完成编写后直接完成执行,否则您的文件打开时间基本上超出了您的需要。
答案 1 :(得分:7)
使文件描述符保持打开还有安全隐患:http://cwe.mitre.org/data/definitions/403.html
您的程序可能会执行具有不同权限级别的程序,泄漏的文件描述符可能允许私有信息跨越两个不同信任级别的进程之间的边界:
http://osvdb.org/7559
CVE-2006-5397
CVE-2007-5159
CVE-2008-3914
安全漏洞的有趣之处在于,当你编写初始函数时它可能是完全安全的,但是由于看似无辜的变化,一两年后可能会变得不安全。
答案 2 :(得分:6)
在文件关闭之前,输出缓冲区中可能存在未写入的未写入数据。如果在最终写入时发生错误,则无法判断输出是否完整,这可能会导致各种问题。
通过明确调用fclose()
和检查其返回值,您有机会:
或其他适合您情况的方式。
这在fclose()
manual page的评论部分提及。
答案 3 :(得分:4)
是的,PHP通常在退出之前关闭文件。但是你应该总是手动关闭它:
1-这是一个很好的编程习惯
2- PHP可能会意外退出(例如,未捕获的异常)。这可能会使文件中包含要写入的队列中的某些内容,或者锁定该文件。
答案 4 :(得分:0)
除非程序没有结束或需要很长时间,否则它将计入系统中的最大打开文件句柄。但是,是的,PHP允许懒惰。
答案 5 :(得分:0)
不仅在PHP中,我们应该在工作完成时关闭流。通过这种方式,我们允许其他人使用该文件。 如果我们不关闭它,其他程序可能不会使用它,直到程序完全结束(在这种情况下页面)。
答案 6 :(得分:-3)
打开文件时,会在其上放置一个锁,阻止其他进程使用它。 fclose()
删除此锁定。
$handle
不是一个对象,只是一个指针。所以没有析构函数告诉它解锁。