NFS 上的文件锁?

NFS 上的文件锁?

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

答案1

该手册页flock(2)早已过时,但后来已更新为以下内容(重点是我的):

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

这是来自官方 man-pages 网站的内容,http://man7.org/linux/man-pages/man2/flock.2.html显示 man-pages 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

答案2

我不知道 PHPflock()函数是如何实现的,但假设它是系统调用的接口flock(),那么它根本无法在 NFS 上工作。摘自flock()手册页:

flock(2) 不会通过 NFS 锁定文件。请改用 fcntl(2):只要 Linux 版本足够新并且服务器支持锁定,它就可以通过 NFS 工作。

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

答案3

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在两台机器上仔细检查。

答案4

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

相关内容