在用PHP写入文件后为什么需要`fclose`?

loc*_*boy 25 php

为什么我需要在fclose($handle)使用php写入文件后使用该函数完成?程序结束时是否自动执行此操作?

dtb*_*rne 15

是.但是,最好自己动手.此外,您将在脚本的其余部分的整个执行期间保持文件处于打开状态,这是您应该避免的.因此,除非您的脚本在完成编写后直接完成执行,否则您基本上将文件打开的时间超出了您的需要.

  • 您正在使用更多内存,而其他进程可能无法使用该文件. (8认同)
  • 保持开放是件坏事吗?让它打开有什么缺点? (3认同)
  • 您需要通过引用php.net手册或解释器的源代码来备份您的声明. (2认同)
  • 操作系统允许处理的打开文件数量也有限制,因此,如果您要遍历数千个文件,并且在完成后没有关闭文件,您的 PHP 脚本最终(可能)会崩溃他们。 (2认同)

sar*_*old 7

将文件描述符保持打开也有安全隐患:http://cwe.mitre.org/data/definitions/403.html

您的程序可能执行具有不同权限级别的程序,泄漏的文件描述符可能允许私有信息跨越两个不同信任级别的进程之间的边界:

http://osvdb.org/7559
CVE-2006-5397
CVE-2007-5159
CVE-2008-3914

安全漏洞的有趣之处在于,当你编写初始函数时,它可能是完全安全的,但是由于看似无辜的变化,一两年后可能会变得不安全.


Nis*_*röm 6

输出缓冲区中可能存在未写入的数据,在文件关闭之前不会写入.如果在最终写入时发生错误,则无法判断输出是否不完整,这可能会导致各种问题.

通过显式调用fclose() 检查其返回值,您有机会:

  • 重试该操作
  • 展开更改
  • 将失败条件返回给调用函数
  • 将问题报告给用户
  • 在日志文件中记录问题
  • 将故障指示返回到执行环境(例如命令行shell),这在工具链中使用时可能至关重要.

或其他适合您情况的方式.

这在fclose()手册页的评论部分提到.