有没有更好的方法来查看文件是否正在写入


Is there a better way to see if a file is being written to?

我们有一个带有桑巴舞的 FreeBSD 服务器,员工将图像文件复制到该服务器上,然后将其上传到我们的 Web 服务器(这样他们就不必弄乱 ftp)。有时,如果上传脚本在复制文件的同时运行,则可能会上传不完整的文件。

我们通过获取文件列表和文件大小,然后等待 5 秒钟并重新检查文件大小来解决此问题。如果大小匹配,则保存上传,如果不匹配,则在 5 秒后再次检查。

这似乎是检查文件是否正在写入的奇怪方法。 有没有更好、更简单的方法?

使用flock函数 http://php.net/flock——在写入文件时获取独占锁flock($handle, LOCK_EX),写完后释放锁flock($handle, LOCK_UN)

上传脚本也可以尝试获取独占写入锁,如果成功,可以移动文件,否则不可以。

编辑:抱歉,我忘记了用户通过桑巴将文件复制到服务器...所以复制时没有空间使用flock...但是上传脚本仍然可以使用flock($handle, LOCK_EX)来查看它是否成功。

我建议shell_exec() smbstatus(1),例如 smbstatus -LB检查锁定的文件

编写脚本将文件复制到 Samba 服务器上的临时文件夹,然后在完全复制和刷新后,将它们移动到上传文件夹(即取消链接/链接,不再复制)。