Symfony: вызов команды в контроллере для длительного действия - PullRequest
0 голосов
/ 31 октября 2018

У меня есть приложение, в котором я могу генерировать необработанный экспорт в xls.

Проблема в том, что генерация xls может быть очень длинной, превышающей время ожидания.

Я проверил, и мой запрос не является виновником (занимает <2 с для обычного запроса), но генерация xls очень длинная (для нескольких тысяч строк я помещаю разные цвета в ячейки, условно отображаемые данные ..) .). </p>

Я думал о команде, которая запускается в CLI, без проблем с тайм-аутом.

Я не могу использовать его напрямую, потому что генерируемые данные должны вызываться пользователями (без доступа к сети).

Так что я подумал о вызове команды в моем контроллере Пользователь выбирает параметры в форме, отправляет форму, а затем в контроллере параметры передаются в команду, выполняющую тяжелую работу.

Мой вопрос: в этом случае вызывается ли команда в контексте CLI (с тайм-аутом CLI = 0) или она вызывается в контексте приложения (Web) (с тайм-аутом <50 с)? В последнем случае это было бы бесполезно, и я был бы признателен за любые советы по любому альтернативному способу решения моей проблемы. </p>

1 Ответ

0 голосов
/ 31 октября 2018

Это учебник для очереди сообщений.

RabbitMq рекомендуется и прост в использовании с Symfony.

У вас будет продюсер, который сгенерирует сообщение и поместит его в очередь. Это будет сделано в вашем контроллере.

Запрос БД и генерация листа должны быть помещены в получателя (команда, работающая в фоновом режиме, выбирающая сообщения из очереди и обрабатывающая их).

Когда лист будет готов, сохраните его в виде файла и, возможно, зарегистрируйте в базе данных с уникальным идентификатором.

Этот миг звучит сложно, но он очень прост, и вы все равно должны изучить его:)

Проблема с отображением результата пользователю. Самый простой способ - обновлять браузер каждые X секунд. Другие варианты включают опрос с помощью ajax и уведомления на основе веб-сокетов с сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...