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

时间:2010-06-22 23:00:24

标签: php zend-certification

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

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

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

2 个答案:

答案 0 :(得分:5)

流有this set of operations - writereadcloseflush(强制,即使它们不是操作)和{{1} },seekcaststat(可选)。当您请求文件锁定时,set_option操作为called

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

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

其余问题涉及STDIO流。现在,当检查流是否支持使用set_option进行阻塞时,PHP实际上并不尝试使用flock,它会向stream_supports_lock操作传递一个特殊值,该值会查询“此流是否支持文件锁定”? STDIO流操作always responds it does,因此看起来所有剩下的两个答案都是正确的。

但是,set_option操作声称它支持文件锁定这一事实并不适用。当您真正尝试获取锁定时,it may fail。那么什么时候可以保证工作?肯定不是Windows的分享,因为这几乎可以得到任何支持。我们留下了“在本地文件系统上”。所以答案是,通过淘汰

  

访问本地文件系统的流

但请注意(已被过时)warning in the manual

  

FAT及其衍生文件等过时的文件系统不支持flock(),因此在[sic]环境下总是返回FALSE(对于Windows 98用户尤其如此)。

答案 1 :(得分:1)

哦,好问题。

Checking if a stream supports locking仅在5.3中添加,但似乎“始终”的streamWrapper example class has a stream_lock method已存在。 stream_lock表明它也适用于streams that can be blocked

我不希望你可以植入套接字,所以看起来你的答案是#2:你可以放心地知道当流是(本地)文件时,植入流会起作用。

(flock如何对远程文件(NFS,CIFS)进行操作取决于提供这些远程文件的服务。例如,某些旧版本的各种NFS守护程序根本不支持flock。)