【发布时间】:2019-04-10 06:51:58
【问题描述】:
我正在开发一个应用程序,该应用程序每 1 分钟轮询网络文件服务器 (cifs) 上的一个文件夹以查找计划的 cron 作业中的新文件。
当它看到一个新文件时,它会临时将其复制到本地文件系统,然后对文件执行各种操作,然后从本地和网络文件系统中删除它。
我担心在有人将文件添加到网络文件夹的同时,我的应用程序会轮询网络文件夹,这可能会遇到争用情况。这些文件非常小(1kb),因此当我轮询文件夹时文件仍然在复制的情况应该是非常罕见的,但它可能会发生。
我的问题是,这是一个合理的担忧吗?如果是,我应该如何处理?
【问题讨论】:
-
您可能希望在写入文件时以某种方式“锁定”文件。看看:serverfault.com/questions/806156/… - 如果你做到了,你的计划作业将无法处理文件,将等待下一次。
-
嗯,我认为这不会起作用,因为文件没有以编程方式添加到网络文件夹中。员工正在通过 Windows 资源管理器将文件复制到此文件夹。
-
啊,太糟糕了。只处理最后修改日期在特定时间(例如一小时)之后的文件呢?这实际上取决于您在编写它们后需要多快处理它们。
-
这是我考虑过的一种选择。我可能会在 5 分钟后检查文件。不知道有没有更好的办法。
-
最好的解决方案是让应用程序将文件复制到一个临时名称,然后重命名它。重命名是一个原子操作,因此您永远不会看到正在复制的文件。
标签: php filesystems race-condition fileserver