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

    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, пошагово, чтобы пользователь видел все процессы. Да, при большом желании в "упаковщике" можно еще сохранять не только имя файла, но и размер файла. А потом написать хитрую магическую формулу для рассчета времени запаковки. Но это уже отдельная тема, которую предстоит автору задать в отдельном вопросе.
    Ответ написан