这是来自PHP zend考试的问题,
使用flock()锁定流只能确保在什么情况下工作?
答案 0 :(得分:5)
流有this set of operations - write
,read
,close
,flush
(强制,即使它们不是操作)和{{1} },seek
,cast
,stat
(可选)。当您请求文件锁定时,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。)