这是一个普遍的问题,而不是一个特定于语言的问题。我必须实现一个程序,它自动处理csv文件(读取文件,写入数据库,移动文件)。这根本不是问题。
问题是 - 我有一个目录结构,如下所示,如果有任何需要的新文件,必须定期检查(大概是5分钟左右)处理...
-+ basedir
--+ AT (ISO country abbreviation ...)
--+ DE
---+ ID1234 (directory for user)
---+ ID2345
---+ ID4523
---+ ...
您是否知道如何以非常高效的方式浏览每个目录?我认为在所有目录上执行循环并扫描它们并不好。
文件通过FTP上传,我可以完全控制服务器。
答案 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等...