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

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

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

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

просто

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

крепкий

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

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

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

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

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

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

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

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

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

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

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