我们有一个带有桑巴舞的 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 服务器上的临时文件夹,然后在完全复制和刷新后,将它们移动到上传文件夹(即取消链接/链接,不再复制)。