NFS上的文件锁定?


18

我的服务器使用NFS(网络文件系统),但是我无法使用PHP的flock()函数。是否可以在NFS上锁定文件?

Answers:


11

手册页flock(2)已经过时了很长时间,但是此后更新为(强调我的):

从Linux 2.6.12开始, NFS客户端通过将flock()锁模拟为整个文件的字节范围锁来支持它们。这意味着fcntl(2)和flock()锁确实通过NFS相互交互。从Linux 2.6.37开始,内核支持兼容模式,该模式允许将flock()锁(以及fcntl(2)字节区域锁)视为本地模式。请参阅nfs(5)中有关local_lock选项的讨论。

这是从官方手册页网站http://man7.org/linux/man-pages/man2/flock.2.html上获得的,其中显示了4.00版手册中的新版本。

Linux 2.6.12于2005年发布。

这本来是对janneb答案的评论,但当时我没有声誉。此文档更新发生在2014年:http//git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id = e449654fdb3f19aafc569df47d12bffdf6276236


11

我不知道PHP flock()函数是如何实现的,但是假设它是flock()syscall 的接口,那么它在NFS上根本不起作用。从flock()联机帮助页:

flock(2)不会通过NFS锁定文件。使用fcntl(2)代替:给定最新版本的Linux和支持锁定的服务器,它可以在NFS上运行。

当然,手册页上所说的一切,无论多么过时,都是最终的真理。


+1,讽刺!NFS常见问题解答中的 D10项进行了详细说明。
themel 2013年

8

flock()在Linux NFS(包括PHP)上可以正常工作。我们对其进行了广泛使用,并对其进行了全面测试,以验证其是否可以正常工作。检查是否在客户端和服务器上都在运行所有必要的服务。查找“ portmapper”和“ rpc.statd”。如果它们没有运行,则需要找出哪个init脚本在发行版上启动它们。在基于Debian的发行版中,它是“ /etc/init.d/portmap”和“ /etc/init.d/nfs-common”。

从客户端运行“ rpcinfo -u $NFSSERVER status”,看看是否收到响应。在我的设置中,结果是“程序100024版本1准备就绪并正在等待”。

哦,还要记住,在某些情况下,如果客户端和服务器之间都没有可靠的主机名条目,则NFS和statd可能会感到不高兴。仔细检查/etc/hosts两台机器。


1
我真的无权更改服务器特定的详细信息。从php.ini中甚至禁用了flock()-函数,因为它无法正常工作,至少我已经被告知。
rFactor

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.