我们的 Symfony2 Web 应用程序在开发模式下使用 Assetic 观察器来动态重新编译资产。
Web 应用程序在 Docker 容器中运行,该容器在 Vagrant VM (Ubuntu 12.04 Precise) 中运行。
主机是 OSX 10.9 Mavericks,它通过 NFS (v3) 共享与 VM 共享代码文件夹,并且代码通过 Docker 中的主机/来宾卷安装在容器中。
由于 inotify 似乎无法检测通过 NFSv3 的文件修改,因此观察程序以轮询模式工作,该模式可能非常慢(检测修改大约需要 1/2 分钟)。
我读到 NFSv4 符合 inotify 标准,但我没有找到任何好的资源。
有没有办法让 NFS/inotify 一起工作?
不幸的是,inotifycannot在 NFS 上工作。 inotify 的工作原理是将自身挂接到内核的 VFS(虚拟文件系统)层。每当发生修改时,inotify 都会知道它,因为修改发生在同一台机器上,因此在同一个内核中 - 这使得整个事情成为可能。
使用 NFS,修改发生在服务器上,并且通知会发送到客户端。但当发生更改时,NFS 不会通知客户端。否则,它就无法扩展。 NFS 的设计(和操作)是为了在单个服务器上拥有数千个客户端。想象一下,如果您做了一个微小的更改,服务器必须将其推送给所有客户端!
当然,你可以说“嘿,NFS协议中应该有一个订阅机制,这样客户端就可以告诉服务器他们想知道特定位置发生的变化”。好吧,NFS 是 30 年前设计的,所以请原谅他们不包括这个订阅/通知系统:-)
我不熟悉 Assetic,但也许您可以使用自定义脚本来手动监视更改,并在每次检测到更改时重新编译资产。只需遍历包含资产源的目录,跟踪关联数组中每个文件的 mtime,每次检测到新文件(或新的 mtime)时,重新编译。繁荣!
也可以看看关于 inotify 和 NFS 的另一个 SO 问题 https://stackoverflow.com/questions/4231243/inotify-with-nfs.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)