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