我们有一个带有samba的FreeBSD服务器,员工将图像文件复制到其上,然后上传到我们的Web服务器(这样他们就不必乱用ftp)。有时,如果上载脚本在复制文件的同时运行,则可以上载不完整的文件。
我们通过获取文件列表以及文件大小来修复此问题,然后等待5秒并重新检查文件大小。如果尺寸匹配则保存到上传,如果它们不匹配,则在另外5秒再次检查。
这似乎是检查文件是否被写入的奇怪方法。有没有更好,更简单的方法呢?
答案 0 :(得分:2)
我建议shell_exec()
smbstatus(1),例如smbstatus -LB
检查锁定的文件
答案 1 :(得分:2)
使用flock
函数http://php.net/flock - 在编写文件时获取独占锁flock($handle, LOCK_EX)
,在写入后释放锁flock($handle, LOCK_UN)
。
上传脚本也可以尝试获取独占写锁,如果成功则可以移动文件,否则没有。
编辑:抱歉,我忘了用户通过samba将文件复制到服务器...因此复制时没有空间可以使用flock
...但是上传如果成功与否,脚本仍然可以使用flock($handle, LOCK_EX)
来查看。
答案 2 :(得分:0)
编写脚本将文件复制到Samba服务器上的临时文件夹,然后在完全复制和刷新后,移动(即取消链接/链接,不再复制),将它们移动到上传文件夹。