这是一个来自PHP zend考试的问题,使用flock()来锁定流只有在什么情况下才能工作?
使用flock()来锁定一个流只能保证在什么情况下工作?
- 当在Linux环境中的本地文件系统中运行
- 当访问本地文件系统的流
- 当在Windows环境下运行和访问共享
- 当访问一个双向流
- 当访问一个只读流
这是一个来自PHP zend考试的问题,使用flock()来锁定流只有在什么情况下才能工作?
使用flock()来锁定一个流只能保证在什么情况下工作?
甲流有this set of operations - write
,read
,close
,flush
(强制性的,即使他们没有OPS)和seek
,cast
,stat
,set_option
(可选)。当您请求文件锁定时,set_option
操作是called。
就在这里,您可以看到双向或只读与此无关。可以实现一个任意的包装,使写入和读取有一定的效果,但尚未实现set_option
,因为它是可选的。同样,可以实现无操作write
操作,但在我的set_option
实现中处理文件锁定。在Linux环境中运行也是无关紧要的,因为重要的是流支持什么。我承认它意味着“在Linux环境下从本地文件系统运行PHP”,而不是像“从PHP运行PHP”那样,我承认它意味着“在Linux环境下运行本地文件系统” Linux环境下的AFS文件系统“,如果意味着”在Linux环境中访问支持本地文件系统的流“,这可能是正确答案,因为下面描述了手动警告)。
其余问题涉及STDIO流。现在,当检查一个流是否支持stream_supports_lock
阻塞时,PHP实际上并没有尝试一个群,它会通过set_option
操作传递一个特殊值来查询“这个流是否支持文件锁定”? STDIO流操作always responds it does,所以看起来所有剩下的两个答案都是正确的。
但是,set_option
操作声称它支持文件锁定的事实并未使其成为真实。当你真的试图获得锁,it may fail。那么它何时能保证工作?当然不是Windows共享,因为这些可以支持几乎任何东西。我们留在“在本地文件系统上”。因此,答案是,通过消除
当访问本地文件系统的流
但是请注意,(公认过时)warning in the manual:
羊群()不支持在过时的文件系统(如FAT及其派生文件系统)上,因此在此[原文]环境下总是返回FALSE(对于Windows 98用户尤其如此)。
哦,好问题。
Checking if a stream supports locking仅在5.3中添加,但似乎“始终”存在的streamWrapper example class has a stream_lock
method。 stream_lock
表明它也可以在streams that can be blocked上工作。
我不指望你可以植入一个套接字,所以看起来你的答案是#2:你可以放心地知道当流是一个(本地)文件时植绒一个流将工作。
(如何羊群在远程文件操作(NFS,CIFS)是由服务提供者远程文件。有些老版本的各种NFS守护程序不支持群可言,例如。)
自2000年以来,NTFS已成为所有Windows版本上的默认文件系统.Flock应该在NTFS上正常工作。此外,FreeBSD和Solaris等其他UNIX相同的程序肯定会支持flock,这使得Linux特定的答案不正确,或者如果正确的话措辞很差。 – Charles 2010-06-23 01:43:11
@Cha好吧,我误解了选择。这绝对是第二个,因为第一个说“运行”,而不是“访问流”。 – Artefacto 2010-06-23 01:54:07
好点。鉴于确切的措辞,他们似乎都是不正确的。 – Charles 2010-06-23 02:02:23