我的服务器使用 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