Задать вопрос
  • Прогресс выполнения php foreach в ajax запросе?

    @Fellowship
    Все варианты, предложенные здесь подразумевают установку дополнительного ПО или использования иных технологий.

    Но на самом деле можно обойтись и без них.

    Смотрите.
    У Laravel есть замечательный механизм кронджобов. Используйте его в связке с mysql.

    Допустим у нас есть таблица с тасками для выполнения в фоне с 4мя полями
    id, task, progress, result
    (я уже правда не помню структуру таблицы laravel у кроновых тасков)

    И ajax запрос первый будет лишь командой на вставку новой задачи, который на js возвращает лишь id таска.

    Далее на клиенте реализовываем второй запрос - проверка статуса. Сам запрос просто запрашивает из базы значение поля progress из базы, а Js, например, рисует красивый прогресс. И пускай он с интервалом раз в секунду или несколько секунд (в зависимости от задачи) опрашивает сервер.

    Далее реализовываем третий запрос - получение результата. Как только на второй запрос получили ответ, что таск выполнен на 100%, отправляем запрос на получение результата который берет его из базы (или из redis, или из сессии, короче из любого хранилища. Если сайт не нагружен можно и в базе хранить в сериализованном виде).

    А сам соответственно таск пускает выполняется себе в фоне и никого не трогает. Если это vds или dedicated то на такие процессы вообще можно поставить ограничения и по памяти и по нагрузки на проц, или вообще вынести на отдельный docker или виртуальный контейнер. Короче, поле для деятельности масса.

    Плюсы такого варианта:
    • не нужно использовать современные технологии типа websoket (по их незнанию или по нежеланию или просто отсутствию возможности)
    • Поддержка браузеров явно больше чем у WebSocket (wikipedia)
    • достаточно использовать только встроенные технологии laravel
    • не требует сторонних библиотек


    Минусы данного подхода:
    • Все таки действительно 21 век на носу и можно уже изучить WebSocket
    • Требует постоянного опроса сервера, хоть нагрузка и небольшая от них, но все таки нагрузка
    • Вопрос с хранением результатов остается открытым для очень больших запросов и при высокой нагрузке
    Ответ написан
    Комментировать