Лучший способ проверки новых файлов, которые необходимо обработать - PullRequest
0 голосов
/ 06 марта 2012

Это более общий вопрос, чем действительно языковой.Я должен реализовать программу, которая автоматически обрабатывает CSV-файлы (чтение файла, запись в базу данных, перемещение файла).Это вовсе не проблема.

Проблема в том, что у меня есть структура каталогов , подобная следующей, и я должен регулярно проверять (будет около 5 минут или около того), еслив нем есть какие-то новые файлы, которые нужно обработать ...

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

Есть ли у вас какие-либо идеи о том, как очень эффективно просматривать каждый каталог?Я не думаю, что это хорошо, чтобы выполнить цикл по всем каталогам и сканировать их.

Файлы загружаются через FTP, и я полностью контролирую сервер.

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Просмотр журнала на FTP-сервере - это хорошая идея, особенно если у вас есть много подкаталогов для сканирования. A tail позволяет избежать затрат на решение для опроса и точно скажет вам, где искать файлы. Но я думаю, что это было бы легче реализовать с помощью оболочки, чем 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

Для запуска действий, основанных на этом, я мог бы использовать скрипт оболочки, подобный следующему:

#!/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 special.

Добавить обработку ошибок по вкусу.

0 голосов
/ 06 марта 2012

Вы можете настроить ведение журнала для ftp и проанализировать журнал для новых событий.

Или попробуйте что-нибудь вроде inotify, fschange, Audit, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...