Все варианты, предложенные здесь подразумевают установку дополнительного ПО или использования иных технологий.
Но на самом деле можно обойтись и без них.
Смотрите.
У Laravel есть замечательный механизм кронджобов. Используйте его в связке с mysql.
Допустим у нас есть таблица с тасками для выполнения в фоне с 4мя полями
id, task, progress, result
(я уже правда не помню структуру таблицы laravel у кроновых тасков)
И ajax запрос первый будет лишь командой на вставку новой задачи, который на js возвращает лишь id таска.
Далее на клиенте реализовываем второй запрос - проверка статуса. Сам запрос просто запрашивает из базы значение поля progress из базы, а Js, например, рисует красивый прогресс. И пускай он с интервалом раз в секунду или несколько секунд (в зависимости от задачи) опрашивает сервер.
Далее реализовываем третий запрос - получение результата. Как только на второй запрос получили ответ, что таск выполнен на 100%, отправляем запрос на получение результата который берет его из базы (или из redis, или из сессии, короче из любого хранилища. Если сайт не нагружен можно и в базе хранить в сериализованном виде).
А сам соответственно таск пускает выполняется себе в фоне и никого не трогает. Если это vds или dedicated то на такие процессы вообще можно поставить ограничения и по памяти и по нагрузки на проц, или вообще вынести на отдельный docker или виртуальный контейнер. Короче, поле для деятельности масса.
Плюсы такого варианта:
- не нужно использовать современные технологии типа websoket (по их незнанию или по нежеланию или просто отсутствию возможности)
- Поддержка браузеров явно больше чем у WebSocket (wikipedia)
- достаточно использовать только встроенные технологии laravel
- не требует сторонних библиотек
Минусы данного подхода:
- Все таки действительно 21 век на носу и можно уже изучить WebSocket
- Требует постоянного опроса сервера, хоть нагрузка и небольшая от них, но все таки нагрузка
- Вопрос с хранением результатов остается открытым для очень больших запросов и при высокой нагрузке