我们有一个带有 samba 的 FreeBSD 服务器,员工将图像文件复制到该服务器上,然后上传到我们的 Web 服务器(这样他们就不必与 ftp 混淆)。有时,如果上传脚本在复制文件的同时运行,它可能会上传不完整的文件。
我们通过获取文件列表以及文件大小来解决此问题,然后等待 5 秒并重新检查文件大小。如果尺寸匹配,则保存上传,如果它们不匹配,则在另外 5 秒内再次检查。
这似乎是一种检查文件是否正在写入的奇怪方法。有没有更好、更简单的方法来做到这一点?
我们有一个带有 samba 的 FreeBSD 服务器,员工将图像文件复制到该服务器上,然后上传到我们的 Web 服务器(这样他们就不必与 ftp 混淆)。有时,如果上传脚本在复制文件的同时运行,它可能会上传不完整的文件。
我们通过获取文件列表以及文件大小来解决此问题,然后等待 5 秒并重新检查文件大小。如果尺寸匹配,则保存上传,如果它们不匹配,则在另外 5 秒内再次检查。
这似乎是一种检查文件是否正在写入的奇怪方法。有没有更好、更简单的方法来做到这一点?
I recommend to shell_exec()
smbstatus(1), e.g. smbstatus -LB
to check for locked files
使用flock
函数http://php.net/flock - 写入文件时获得排他锁flock($handle, LOCK_EX)
,写入后释放锁flock($handle, LOCK_UN)
。
上传脚本也可以尝试获取独占写锁,如果成功则可以移动文件,否则不能。
编辑:对不起,我忘记了用户通过 samba 将文件复制到服务器...所以flock
复制时没有空间可以使用...但是上传脚本仍然可以flock($handle, LOCK_EX)
用来查看是否成功。
编写脚本将文件复制到 Samba 服务器上的临时文件夹,然后在完全复制和刷新后,将它们移动(即取消链接/链接,不再复制)到上传文件夹。