使用flock()锁定流只能确保在什么情况下工作?

use*_*707 2 php zend-certification

这是来自PHP zend考试的问题,

使用flock()锁定流只能确保在什么情况下工作?

  • 在Linux环境中运行本地文件系统时
  • 访问本地文件系统的流时
  • 在Windows环境中运行并访问共享时
  • 访问双向流时
  • 访问只读流时

Art*_*cto 5

甲流有这一套操作 - ,write,read,close(flush强制性的,即使他们没有OPS)和seek,cast,stat,set_option(可选).请求文件锁定时,将调用set_option操作.

就在这里,您可以看到双向或只读与此无关.可以实现任意包装器,使写入和读取具有一些效果但尚未实现set_option,因为它是可选的.同样,可以实现无操作write操作,但在我的set_option实现中处理文件锁.在Linux环境中运行也无关紧要,因为重要的是流支持的内容.

(注意:我不确定"在Linux环境中运行本地文件系统"是什么意思.我承认它意味着"在Linux环境中从本地文件系统运行PHP",而不是"例如在Linux中从AFS文件系统运行PHP"环境".如果意味着"访问支持Linux环境中的本地文件系统的流",这可能是正确的答案,给出下面描述的手动警告).

剩下的问题涉及STDIO流.现在,在检查流是否支持阻塞时stream_supports_lock,PHP实际上并不尝试使用flock,它会向set_option操作传递一个特殊值,该值会查询"此流支持文件锁定"吗?STDIO流操作总是响应它,所以看起来所有剩下的两个答案都是正确的.

但是,set_option操作声称它支持文件锁定的事实并不能成为现实.当您实际尝试获取锁定时,它可能会失败.那么什么时候可以保证工作?肯定不是Windows的分享,因为这几乎可以得到任何支持.我们留下了"在本地文件系统上".所以答案是,通过淘汰

访问本地文件系统的流时

但是,请注意手册中的(公认的过时)警告:

flhell()在FAT及其派生等过时的文件系统上不受支持,因此在这个[原文如此]环境下总是返回FALSE(对于Windows 98用户尤其如此).