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

时间:2012-03-06 16:00:43

标签: php directory-structure

这是一个普遍的问题,而不是一个特定于语言的问题。我必须实现一个程序,它自动处理csv文件(读取文件,写入数据库,移动文件)。这根本不是问题。

问题是 - 我有一个目录结构,如下所示,如果有任何需要的新文件,必须定期检查(大概是5分钟左右)处理...

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

您是否知道如何以非常高效的方式浏览每个目录?我认为在所有目录上执行循环并扫描它们并不好。

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

2 个答案:

答案 0 :(得分:2)

在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特殊功能启动。

添加错误处理。

答案 1 :(得分:0)

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

或尝试使用inotify,fschange,audit等...