有没有更好的方法来确定一个文件是否正在被写入?

6
我们有一个FreeBSD服务器,上面运行着samba,员工将图像文件复制到该服务器上,然后这些文件会被上传到我们的Web服务器(这样他们就不必使用FTP)。有时,如果上传脚本正在运行时文件正在被复制,可能会上传一个不完整的文件。
我们通过获取文件列表及其大小,等待5秒钟并重新检查文件大小来解决此问题。如果大小相同,则可以安全地上传;如果大小不匹配,则再等待5秒钟后再次检查。
这种方式似乎是一种奇怪的检查写入的方法。是否有更好、更简单的方法?

如果(!flock($ fp,LOCK_EX | LOCK_NB)){ //文件被锁定以进行写入 - DaveRandom
不确定flock()和Samba的锁是否可靠地相互识别 - 多年前曾遇到过一些问题。 - Eugen Rieck
@EugenRieck 刚在 Fedora 上试用了一下,似乎可以工作,但我猜你的情况可能会有所不同... - DaveRandom
@DaveRandom 正如我所说,这是多年前的事了……如果我没记错的话,当时使用的是 PHP4 和 Samba 2(在 Linux 2.4 上),现在也许完美运行。 - Eugen Rieck
3个回答

2

我建议使用shell_exec()命令来执行smbstatus(1),例如smbstatus -LB,以检查锁定文件。


2

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

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

编辑:对不起,我忘记了用户通过 samba 将文件复制到服务器上... 因此在复制时没有使用 flock 的空间... 但上传脚本仍然可以使用 flock($handle, LOCK_EX) 来查看是否成功。


0
编写一个脚本将文件复制到Samba服务器上的临时文件夹,然后在完全复制和刷新后将它们移动(即unlink/link,而不是再次复制)到上传文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接