Подтвердить что ты не робот

Обнаружение полного или частичного файла в PHP

В этой системе SFTP будет использоваться для загрузки больших видеофайлов в конкретный каталог на сервере. Я пишу PHP script, который будет использоваться для копирования полностью загруженных файлов в другой каталог.

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

4b9b3361

Ответ 1

В теории, если вам разрешено запускать системные команды с PHP, вы можете попытаться получить pids ваших процессов sftp-сервера с помощью команды pidof, а затем использовать lsof вывода, чтобы проверить, существуют ли дескрипторы открытых файлов для текущего загруженного файла.

Ответ 2

Простой

Если вам просто нужен простой метод, который будет обрабатывать большинство случаев использования - напишите процесс, чтобы проверить последнюю измененную дату или (как указано в вопросе) размер файла, и если он не изменился в установленное время, скажите 1 минута, предположим, что загрузка завершена и обрабатывается. Infact - ваш вопрос рядом с дубликатом другого вопроса, показывающего именно это.

Robust

Альтернативой опросу размера/последнего измененного времени файла (который с медленным или прерывистым соединением может привести к тому, что открытая загрузка будет считаться завершенной слишком рано) заключается в том, чтобы прослушать, когда файл закончил запись с помощью inotify.

Прослушивание IN_CLOSE_WRITE вы можете узнать, когда загрузка ftp завершила обновление определенного файла.

Я никогда не использовал его в php, но из spartan docs выглядит так, что это должно работать точно так же, как базовая библиотека.

Сделать FTP-клиенты для вас

Учитывайте, как работают некоторые ftp-программы, от этого комментария:

стоит упомянуть, что некоторые ftp-серверы создают скрытый временный файл для приема данных, пока передача не будет завершена. То есть .foo-ftpupload-2837948723 в том же пути загрузки, что и целевой файл

Если это применимо, из готового имени файла вы можете сказать, действительно ли завершена загрузка ftp или была остановлена ​​/отключена в середине загрузки.

Ответ 3

Во время передачи единственное, что знает реальный размер файла, - это ваш SFTP-клиент и, возможно, SFTP-сервер (не знаете специфику протокола, поэтому сервер может также знать). Если вы не можете поговорить с SFTP-сервером напрямую, тогда вам придется ждать завершения файла. Проверка через некоторый интервал кажется kludgy, но в данных обстоятельствах довольно хороша. Это то, что мы делаем в моем проекте.

Если у вас очень короткий интервал опроса, он не очень устойчив при работе с загрузками, которые могут остановиться на несколько секунд. Поэтому просто установите интервал в одну минуту или что-то в этом роде. Предполагая, что вы находитесь на платформе, основанной на nix, вы можете настроить задание cron, которое будет выполняться каждую минуту (или независимо от вашего интервала опроса) для запуска вашего script для вас.

Ответ 4

Как сказал @jcolebrand - если у вас нет контроля над процессом загрузки, на самом деле вы не можете сделать ничего, кроме гаданий (размер/дата файла). Я хотел бы найти серверное программное обеспечение, которое позволяет выполнять крючки/скрипты до/после некоторого действия сервера (здесь: передача файла завершена). Я не уверен, существует ли такое программное обеспечение. В качестве последнего средства вы можете адаптировать SFTP-сервер с открытым исходным кодом для своих требований, добавив такой крючок для себя.

Ответ 5

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