Я бы создал файл очереди с тем же именем, что и у "создаваемого zip-файла", но с другим расширением.
На вашем сервере, который создает файл загрузки, позвольте сценарию создать другой файл с тем же именем, но с кодом состояния в качестве расширения.
(ex 123456789.PRO означает, что выполняется, и 123456789.DON для того, чтобы быть готовым)
Сценарий, который создает zip-файл, может затем обновить это имя файла, прежде чем запуск сделает файл .PRO и завершит .DON)
Теперь на вашем веб-сервере выполните ajax-вызов, который читает скрипт PHP, который в свою очередь проверяет, существует ли файл.
файла нет: процесс не запущен
Файл .PRO существует: ОБРАБОТКА
Файл .DON существует: Создать ссылку для скачивания
Вызов ajax можно проверять каждые несколько секунд, в зависимости от того, какую нагрузку на сервер вы хотите.