【问题标题】:Is there a better way to see if a file is being written to?有没有更好的方法来查看是否正在写入文件?
【发布时间】:2012-05-04 14:05:18
【问题描述】:

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

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

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

【问题讨论】:

  • if (!flock($fp, LOCK_EX | LOCK_NB)) { // file is locked for writing ?
  • 不确定flock() 和 samab 的锁是否能可靠地看到对方 - 几年前就出现了一些问题
  • @EugenRieck 刚刚在 Fedora 盒子上玩它,它似乎工作,但我猜 YMMV...
  • @DaveRandom 正如我所说,这是几年前的事了...... PHP4 和 Samba 2(在 Linux 2.4 上)IIRC,现在也可以完美运行

标签: php


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多