Загрузка последних файлов с удаленного сервера без загрузки предыдущих файлов

Я пытаюсь загрузить последние файлы, загруженные на сервер через SFTP. Информация о файле сохраняется в таблице после загрузки с информацией, которая включает контрольную сумму md5, метку времени, имя файла и т. д.

Скрипт запускается как задание cron и просыпается несколько раз в день, чтобы получить новые файлы с набора серверов. Обычно количество файлов невелико, поэтому можно просто загрузить все, хэшировать содержимое и сравнить результат с тем, что существует в базе данных, чтобы определить, является ли файл новым.

Однако теперь у нас есть доступ к серверу, который не очищает содержимое. Таким образом, скачивание и хеширование всего слишком дорого. Кажется, единственный вариант — удаленно оценить метаданные файла и использовать их, чтобы определить, является ли файл новым.

Одно из решений, которое, по моему мнению, могло бы сработать, состояло в том, чтобы использовать mtime или ctime удаленных файлов для сравнения с последней меткой времени, хранящейся в таблице файлов. Затем сценарий будет загружать только файлы с mtime или ctime, превышающим последнюю записанную отметку времени (полученную из последней загрузки). Однако mtime и ctime не относятся к времени загрузки. Таким образом, в худшем случае файл может быть загружен после последнего запуска cron, у которого mtime или ctime меньше, чем самая последняя записанная метка времени.

Другое решение, которое я рассматривал, заключается в обработке имени файла и метки времени как своего рода составного ключа и сравнении этих двух атрибутов с записями в таблице файлов. Я не уверен, что это правильная или безопасная идея. Имена файлов довольно уникальны, так что, возможно, это сработает. Я действительно ищу самую безопасную ставку с точки зрения предотвращения пропущенных файлов.

Сценарий, который фактически выполняет доступ, написан в основном с использованием библиотеки phpseclib sftp.

У меня нет доступа по ssh, поэтому удаленная контрольная сумма невозможна.

Мы будем очень признательны за любое понимание.

Спасибо


person jonnywalkerr    schedule 28.05.2015    source источник
comment
Я думаю, вы могли бы сделать размер файла тоже. Вы спрашиваете о том, как получить эту информацию с помощью phpseclib, или просто стоит ли использовать эту информацию таким образом?   -  person neubert    schedule 29.05.2015


Ответы (1)


Вы сами ответили на свой вопрос.

Собирайте имена файлов, время модификации и размеры удаленных файлов. Храните их в базе данных. И в следующий раз соберите те же метаданные и сравните с предыдущим запуском. Это лучшее, что вы можете сделать.

Маловероятно, что содержимое файла изменится без изменения временной метки или размера файла.


Конечно, кроме вычисления контрольной суммы файла. Но phpseclib этого не поддерживает. И большинство SFTP-серверов (особенно OpenSSH) тоже этого не делают.
См. Как выполнять контрольные суммы во время передачи файла SFTP для обеспечения целостности данных?< /а>

person Martin Prikryl    schedule 29.05.2015