У меня есть PHP-скрипт, который открывает локальный каталог для копирования и обработки некоторых файлов. Но эти файлы могут быть неполными, потому что они загружаются медленным процессом FTP, и я не хочу копировать или обрабатывать файлы, которые еще не были полностью загружены.
Возможно ли в PHP узнать, что файл все еще копируется (то есть читается) или записывается?
Мне нужен мой скрипт для обработки только тех файлов, которые были полностью загружены.
Процесс ftp теперь загружает файлы параллельно, и для каждого размера файла требуется больше 1 секунды, поэтому этот трюк сейчас не работает для меня, любой другой метод предлагает
У вас есть скриптовый контроль над процессом FTP? Если да, попросите сценарий, загружающий загружаемый файл [FILENAME] .complete (пустой текстовый файл) после завершения первичной загрузки, так что скрипт обработки знает, что файл завершен, если есть соответствующий файл * .complete.
+1 к @MidnightLightning за отличное предложение. Если у вас нет контроля над процессом, у вас есть несколько вариантов:
Если вы знаете, какой должен быть конечный размер файла, используйте filesize()
чтобы сравнить текущий размер с известным размером. Продолжайте проверять, пока они не совпадут.
Если вы не знаете, какой конечный размер должен быть, он становится немного сложнее. Вы можете использовать filesize()
чтобы проверить размер файла, подождать секунду или два и снова проверить его. Если размер не изменился, загрузка должна быть завершена. Проблема со вторым методом заключается в том, что если вы загружаете файлы, то по какой-то причине он может дать вам ложный результат. Поэтому время ожидания – это ключ.
Вы не указываете, какую ОС вы используете, но если это поле типа Unix, у вас должен быть fuser
и / или lsof
. fuser сообщит о том, кто использует определенный файл, и lsof отобразит все открытые файлы (включая сокеты, fifos, .so и т. д.). Любой из них, скорее всего, будет использоваться для мониторинга вашего каталога.
На конце окна есть несколько бесплатных инструментов от Sysinternals, которые делают то же самое. handle
может сделать трюк