Pull to refresh

Решение для пакетной обработки файлов (PHP)

Reading time2 min
Views1.5K
Я думаю, достаточно часто в корпоративной админке, или просто административной части какого-либо сайта возникает потребность в обработке большого количества файлов, и показа состояния операции пользователю.

Это может быть пакетная обработка залитых картинок, произведение бэкапа документов, заливка большого дампа БД и так далее. При написании моего файлового менеджера (ждите взрыва популярности в 2010 году ;)) я написал простенькую библиотеку для организации операций с файлами, с показом состояния операции пользователю.

Идея, положенная в основу, очень проста:


Любую операцию над файлами можно разделить на несколько составляющих:
  1. получение самого списка файлов, которые необходимы для работы, и организация корректного «раскрытия» директорий — без рекурсии (почему так, поясню позже)
  2. непосредственная обработка файла:
    • начало обработки файла (например, открытие дескриптора файла)
    • цикл(пока файл не обработан){
    •    повторяющийся кусок...
    • }
    • конец обработки файла (например, закрытие дескриптора файла)

Если это — операция копирования файла, или выполнение дампа, то все этапы будут присутствовать. Для более простых операций, вроде удаления файлов, ни цикла, ни завершающей стадии может и не быть.

Для чего это все? Почему так сложно?


Теперь, когда мы поняли, из каких частей может состоять операция над файлами, приступим к самому главному: что это дает в приложении к нашей задаче (показывать состояние сложной и длительной операции над файлами)?

Это дает следующее:
  1. Сохранение всего дерева файлов, ждущих обработки (помните, я говорил про нерекурсивые алгоритмы раскрытия дерева директорий?)
  2. Теоретическая возможность сохранять состояние операции в любом ее месте (то есть, сразу после начала, или где-то посередине цикла)
  3. Как следствие предыдущих двух, возможность планово прерывать операцию через определенные промежутки времени, чтобы показывать состояние операции пользователю, и опять стартовать с последнего запомненного места
  4. (Не реализовано) Возможность контроля ошибок операции прямо во время ее исполнения, без потери состояния и полного завершения работы


Что изменится для пользователя?


До:


loading…
(спустя полчаса) 504 gateway timeout

После:


starting convert…

(обновление статуса каждые 5 секунд) loading (123 of 3000 files converted)…

operation complete

Где сама библиотека?


Сам текст библиотеки (150 строчек с комментариями) и простенький пример использования находятся тут:

forum.dklab.ru/viewtopic.php?p=146572#146572

Использование в моем файл-менеджере:

demo.dolphin-php.org (логин login, пароль password, версия — full) (копирование, удаление, CHMOD файлов, ...)

Более подробное описание в формате .doc [English]:

m.forum.dklab.ru/files/multipart.rar
Tags:
Hubs:
Total votes 9: ↑8 and ↓1+7
Comments16

Articles