NFS 上的文件锁定?

rFa*_*tor 18 filesystems nfs locking network-share

我的服务器使用 NFS(网络文件系统),而我无法使用 PHP 的 flock() 函数。有没有办法锁定 NFS 上的文件,或者是否需要这样做?

jan*_*neb 12

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

flock(2) 不会通过 NFS 锁定文件。使用 fcntl(2) 代替:如果有足够新的 Linux 版本和支持锁定的服务器,它确实可以在 NFS 上工作。

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


Jos*_*din 12

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

自 Linux 2.6.12 起, NFS 客户端通过将 flock() 锁模拟为整个文件上的字节范围锁来支持 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


Ins*_*yte 9

flock()在 Linux NFS 上工作得很好,包括来自 PHP。我们广泛使用它并对其进行了彻底测试以验证它是否按预期工作。检查您是否正在客户端和服务器上运行所有必要的服务。寻找“portmapper”和“rpc.statd”。如果它们没有运行,您需要确定哪个 init 脚本在您的发行版上启动它们。在基于 Debian 的发行版上,它是“ /etc/init.d/portmap”和“ /etc/init.d/nfs-common”。

从客户端运行“ rpcinfo -u $NFSSERVER status”,看看是否有响应。在我的设置中,结果是“program 100024 version 1 ready and waiting”。

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


rFa*_*tor 3

只是想回答我自己。解决方案可以在这里找到:https ://www.php.net/manual/en/function.flock.php#82521

  • 列出的第二个选项正是我所描述的:使用 Linux NFS 中的内置锁定服务器。故障排除步骤旨在确定它(显然)不起作用的原因...... (3认同)