这是 PHP zend 考试中的一个问题,
使用flock() 锁定流只能保证在什么情况下工作?
- 在 Linux 环境本地文件系统中运行时
- 访问本地文件系统的流时
- 在 Windows 环境中运行并访问共享时
- 访问双向流时
- 访问只读流时
这是 PHP zend 考试中的一个问题,
使用flock() 锁定流只能保证在什么情况下工作?
流具有这组操作– write
, read
, close
, flush
(强制,即使它们不是操作)和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 共享,因为这些几乎可以得到任何支持。我们只剩下“在本地文件系统上”。所以答案是,通过消除
访问本地文件系统的流时
但是请注意,手册中的(公认已过时)警告:
过时的文件系统(如 FAT 及其衍生文件)不支持flock(),因此在此 [原文如此] 环境下将始终返回 FALSE(对于 Windows 98 用户尤其如此)。
哦,好问题。
检查流是否支持锁定仅在 5.3 中添加,但streamWrapper 示例类有一个stream_lock
似乎“始终”存在 的方法。stream_lock
表明它也可以在可以被阻止的流上工作。
我不希望您可以集群套接字,所以看起来您的答案是#2:您可以放心地知道当流是(本地)文件时,集群流将起作用。
(flock 如何对远程文件(NFS、CIFS)进行操作取决于提供这些远程文件的服务。例如,各种 NFS 守护程序的一些旧版本根本不支持flock。)