检查需要处理的新文件的最佳方法
问题描述:
这是一个比真正特定于语言的问题更普遍的问题。我必须实现一个程序,它会自动处理csv文件(读取文件,写入数据库,移动文件)。这根本不是问题。检查需要处理的新文件的最佳方法
问题是 - 我有一个目录结构像下面那样,并且如果有任何需要处理的新文件需要定期检查(将会像5分钟左右)...
-+ basedir
--+ AT (ISO country abbreviation ...)
--+ DE
---+ ID1234 (directory for user)
---+ ID2345
---+ ID4523
---+ ...
你知道如何以非常高效的方式浏览每个目录吗?我认为对所有目录执行循环并扫描它们并不是那么好。
文件通过FTP上传,我完全控制服务器。
答
看着自己的FTP服务器上的日志是一个好主意,尤其是如果你有很多子目录进行扫描。 A 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,审计,...
听起来相当不错。必须检查出来。同时谢谢你:-)! – thedom 2012-03-06 17:40:56