Архив: 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 случаях


Категория