Алгоритм чтения большого количества файлов на php

Добрый день!
Не могу понять как построить алгоритм для создания резервной копии. Имеется большое количество файлов и папок, как их все считать для начала, например, в файл, чтобы потом потихоньку добавлять в архив zip? Проблема в том, что отведенного времени на выполнение скрипта php может не хватить - надо разбить на шаги.
Требуется хотя бы ссылка на материал, который прольет свет на эту проблему или каркас скрипта.

Заранее спасибо!
  • Вопрос задан
  • 3590 просмотров
Решения вопроса 1
Возможен ещё вариант:
1. Из браузера по AJAX фоном посылаем запрос на запуск процесса архивирования (ответа моно и не ждать), в php скрипте на сервере используем "set_time_limit(0)", чтоб скрипт не умер по таймоуту, в скрипте архивируем файлы и периодически в сессию пишем прогресс (сколько упаковано, сколько осталось, что сейчас упаковываем) и считываем из сессии некое значение, которое может сказать нам, что нужно прекратить процесс архивирования.
2. Периодически из браузера делаем AJAX запрос, на сервере читаем значения прогресса из сессии и высылаем браузеру.
3. Если нужно будет прервать процесс, то по AJAX посылаем серверу запрос, на сервере в сессии устанавливаем некое значение, которое скажет архивирующему скрипту, что нужно прекратить.

Удобно тем, что да же если закрыть браузер, то процесс не остановится и при повторной попытке можно узнать, что ещё архивируется и получить статус.
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
hell0w0rd
@hell0w0rd
Просто разработчик
Да никак не сделать - php создан чтобы умирать!!!расрас111
Есть такая штука как очереди, туда добавляешь таск "собрать в архив такие-то файлы", а потом раз в 5 секунд, например смотришь готово или нет.
Еще есть вариант с сокетами и лонг пулингом, но я думаю это слишком сложно для такой задачи
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Не надо пытаться ничего реализовывать через пхп.
Надо узнать о существовании специализированных инструментов.
В частности, если надо заархивировать каталог с файлами, то это делается командой
tar -czf archive.tgz /path/to/catalog
Эта команда добавляется в крон.

А на похапе ничего изобретать не надо
Ответ написан
1. Из браузера по AJAX запрашиваем список файлов требуемых для упаковки. В это время на сервере его подготавливаем и устанавливаем признак начала процесса (симофор, например: lock файл, который будут обязаны проверять другие скрипты, чтоб не изменять структуру каталогов и файлов, и что бы не запускался процесс архивирования повторно, пока есть работающий процесс).
2. Если с сервера прийдёт сообщение, что процесс запущен, выводим в браузере сообщение.
3. Если получили список файлов, то перебираем список и по AJAX поочерёдно отправляем запрос на добавления файла в архив, при этом можно выводить прогресс в браузере (сколько упаковано, сколько осталось, что сейчас упаковываем).
4. Когда перебрали все файлы, то посылаем AJAX запрос и говорим серверу, что закончили, на сервере снимаем симофор, и посылаем в ответ url на скачивание архива (если необходимо).

Только может возникнуть проблема, когда страницу в браузере закрыли, тогда симофор не снимется и повторно скрипт не заработает, для решения, можно проверять когда он был установлен и по истечении некого времени игнорировать, либо сделать кнопку принудительного запуска.
Ответ написан
Комментировать
@SRoman Автор вопроса
Прошу прощения за неточности. Отвечаю:
1. вызываться будет из браузера;
2. php - язык на котором пытаюсь реализовать данный алгоритм.
Ответ написан
Комментировать
@hacker2001
подключись по фтп с локальной машины с помощью питона и сделай дамп
Ответ написан
Комментировать
NurikSakura
@NurikSakura
Если человеку так сильно хочется заморочиться, то почему бы и нет? Ситуацию "в процессе упаковки в архив добавилось еще 100500 файлов" я не рассматриваю. Предполагаю, что с момента запуска скрипта и до его завершения, список файлов неизменен.

Для выполнения задачи нам понадобятся два скрипта - сервер-"упаковщик" и клиент-"вопрошатель".

1. Из браузера запрашиваем "вопрошатель", он по некоему признаку, например, по lock-файлу или по списку процессов определяет, что:
а. "Упаковщик" не запущен
б. "Упаковщик" запущен - goto п.3
2. Если "упаковщик" не запущен - запускаем
3. Читаем файлы list.log и done.log, получаем количество строк в обоих; первый - список всех файлов, второй - список уже запакованных.
4. Показываем пользователю, сколько файлов запаковано, сколько осталось.
5. Обновляем страницу (через жабаскрипт, через мета-рефреш, да хоть через reset компа) и goto п.1

При запуске, "упаковщик":
0. При необходимости, вешает lock-файл для "вопрошателя"
1. В файл list.log собирает список всех файлов, которые нужно заархивировать.
2. В цикле:
а. построчно читает файл
б. добавляет файл в архив
в. записывает имя файла в файл done.log
3. По завершению - умирает, как и положено любому нормальному скрипту на пыхе.

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

Войдите, чтобы написать ответ

Похожие вопросы