Symfony: запуск фонового процесса и отслеживание его состояния

90
15 марта 2021, 20:50

Возник вопрос следующего характера. Есть кнопка, при нажатии на которую посылается AJAX-запрос на контроллер. В нем выполняется задача, которая чаще всего длится довольно долго.

...
$process = new Process("...");
$process->start();
...

То, что start запускает процесс асинхронно - это понятно. Но вот вопрос: как отслеживать состояние процесса и как узнать, что он завершился? Помимо этого, я хочу предотвратить случаи, когда пользователь посылает такой запрос, перезагружает страницу и посылает такой же запрос снова, а именно, чтобы кнопка была недоступна, если в фоне уже запущен процесс. Также необходимо как-то узнать, что процесс завершился и разблокировать кнопку. Собственно, как это реализовать?

Дополнительно: Также, было бы неплохо контролировать эти процессы извне, например, отслеживать их состояние на отдельной странице и при желании обрубать эти процессы. Возможно ли в symfony получить доступ к процессу, запущенного в одном контроллере из другого контроллера?

Answer 1

Боюсь что вы ошибочно можете использовать данный компонент, подразумевая что Symfony асинхронно запустит процесс не привязанный к ядру, однако это не так.

В документации написано вот что

If a Response is sent before a child process had a chance to complete, the server process will be killed (depending on your OS). It means that your task will be stopped right away. Running an asynchronous process is not the same as running a process that survives its parent process.

Т.е. асинхронно запущенный процесс будет жить ровно до момента когда вы пошлете Request. Обратите на это внимание, это важно.

Т.е. это не асинхронный процесс в классическом его понимании, например как в JS, однако позволяет решить наверное какие-то задачи, во время выполнения которых вы можете выполнять что то другое.

Ежели вы хотите запускать асинхронно процессы, выполняющие задачи, тут вам конечно же стоит воспользоваться очередями. RabbitMQ, например. Ну и заодно сможете контролировать выполняющие процессы через supervisor например, но это уже другая история.

READ ALSO
Ошибка при использовании curl

Ошибка при использовании curl

Я новичок в php, поэтому не судите строго

94
как залить пост на wordpress с помощью curl bash

как залить пост на wordpress с помощью curl bash

есть функция стандартная wp_insert_post() как можно вставить пост с помощью этой функции через bash

70
Java Json выгрузка разных полей

Java Json выгрузка разных полей

Есть объект с несколькими полями который отправляется как Json запрос на сервер

111