Архив: php-синхронизатор папки с ftp
Бюджет
38$
/ 1000
грн
в месяц
Создан: 6 лет назад
Закрыт
- Описание
- Задача: php скриптом (использовать ооп и фраемворки только после согласования, нежелательно) синхронизировать локальную папку с ftp каждые N секунд
Поля в mysql:
- id (auto)
- hash - числовой хеш пути файла, сформированный через hexdec(crc32(""));. Сделать это поле уникальным ключем
- patch - путь файла в текстовом представлении. /папка/папка2/image.png
- type - тип - файл или папка
- last_edit - дата последнего изменения файла/папки. timestamp
- size - размер файла. Для папки размер 0 автоматом
- last_scan - время последнего сканирования файла, когда его нашли
- actual - 1 или 0. см. 3 случай
Случаи, на которые должен реагировать скрипт:
1. Создание файла/папки. Появилась файл/папка, для которой нет хеша в базе данных - закачиваем ее на сервер на основе ее путей и генерируем хеш в бд. Хеш генерируется из пути к файлу/папке
2. Изменение файла. Если у конкретного файла нашелся хеш (после его создания в бд), но не совпадает дата изменения, что хранится в базе, или не совпадает размер - закачиваем по ftp
3. Переименование файла и папки. Здесь проблем нет. Мы сперва проходимся по всем файлам и ищем хеши, а у каких файлов хеша нет - создаем. При этом у нас формируется массив с id хешей, которые мы обработали. Далее мы делаем выборку ВСЕХ записей из таблицы. Для снижения нагрузки это можно делать пореже, каждый час например. Мы сравниваем то, что просканировано, и то, что есть в базе, и находим то, что есть в базе, но не было найдено при сканировании. Это то, что было переименовано. И закачано 1 и 2 проверками. Следственно, то, что было переименовано - старую неактуальную папку или файл мы удаляем с ftp сервера, при этом помечаем в базе данных, что такой то хеш больше не актуален (actual = 0) и он при следующем обходе не используется
---------------------------------------------------------------------------------------
Следующая проблема, с которой можно столкнуться. Если это мгновенный синхронизатор, то и реагировать он должен сразу на изменения. Следственно, его необходимо часто запускать.
Я предлагаю написать крон файл, который будет запускаться обычным кроном раз в минуту, а этот файл уже будет работать в течении к примеру 300 секунд, и запускать каждую секунду сам синхронизатор, это можно реализовать через curl, при этом если синхронизатор будет работать дольше секунды - то запускаемый файл будет ждать, это реализуется через таймаут закачки curl-а
Чтобы запускаемый кроном файл запускался не чаще раза в минуту, нужно запретить одновременную работу. Таким образом при запуске, если первый запуск не отработал - второй не начинает свою работу. Это реализуется за счет того, что управляющий файл записывает в текстовый файл или бд,
1. Когда он начал работу
2. Когда он завершил работу
Если он начал работу, но не может ее завершить уже 30 минут - значит с сервером что то случилось, может он упал, и скрипт не мог сообщить, что работа завершена.
Тоесть повторный запуск того же скрипта запускается в 2 случаях
- Категория