检查需要处理的新文件的最佳方式


Best way for checking new files which need to be processed

这更多的是一个一般性问题,而不是一个真正的语言特定问题。我必须实现一个程序,它可以自动处理csv文件(读取文件、写入数据库、移动文件)。这根本不是问题所在。

问题是-我有一个类似下面的目录结构,必须定期检查(大约5分钟左右)其中是否有任何新文件需要处理。。。

-+ basedir
--+ AT (ISO country abbreviation ...)
--+ DE
---+ ID1234 (directory for user)
---+ ID2345
---+ ID4523
---+ ...

你知道如何以一种非常高效的方式浏览每个目录吗?我不认为对所有目录执行循环并扫描它们有什么好处。

文件通过FTP上传,我可以完全控制服务器。

在FTP服务器上查看日志是个好主意,尤其是在有很多子目录要扫描的情况下。tail避免了轮询解决方案的开销,并将准确地告诉您在哪里查找文件。但我认为,使用shell比PHP更容易实现这一点。

我在一台服务器上有vsftpd,它生成的日志包括这样的行:

Fri Feb 24 05:37:43 2012 [pid 86561] [bob] OK UPLOAD: Client "10.2.3.4", "/path/to/file.txt", 6036 bytes, 32.77Kbyte/sec

为了触发基于此的操作,我可以使用如下shell脚本:

#!/bin/sh
tail -F /var/log/vsftpd.log | while read junk junk junk junk junk junk junk user status command junk sourceip file junk; do
  if [ "$command" = "UPLOAD:" -a "$status" = "OK" ]; then
    if echo "$file" | grep -q '/path/to/.*'.txt'; then
      # do some triggered action, like:
      sql="INSERT INTO log VALUES ('$user', '$sourceip', '$file')"
      if mysql -uusername -ppasswd -Ddbname -e"$sql"; then
        filename="`echo '"$file'" | sed -r 's/'"(.*)'",$/''1/'`"
        mv "$filename" /path/to/donefiles/
      fi
    fi
  fi
done

这可以使用操作系统的正常启动功能启动,也可以由cron使用@reboot特殊功能启动。

将错误处理添加到味道中。

您可以为ftp设置日志记录,并为新事件解析日志。

或者尝试inotify、fschange、audit。。。