paulfcdd
@paulfcdd
PHP/Sf/WEB developer

Как выполнить скрипт PHP в фоновм после сабмита формы раз в минуту в течении N минут?

Добрый день,
есть такая задача - клиент может через сайт заказать аренду бокса для вещей, который оборудован "умным замком". При составлении заказа, сам процесс заказа разделяется на два параллельных процесса - одни процес вносит необходимы изменения в базу данных (создает новую запись в таблице Заказы, меняет статус бокса в таблице Боксы и тд), второй процесс должен в течении определенного интервала (напр, в теч 5 минут) раз в минуту исполнять запрос по стороннему АПИ к гейтвею, управляющему умными замками с целью получения от него кода ПИН. Если ПИН получе, еще раз менять некоторые записи в базе, если после 5 раз (1 раз в минуту в теч 5 раз) код ПИН не получен - не делать ничего. Есть ли у ПХП (или в Симфони) какие-то средства для этого?
  • Вопрос задан
  • 556 просмотров
Пригласить эксперта
Ответы на вопрос 2
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Я бы использовал очереди (RabbitMQ, Gearman, beanstalkd)

При сабмите формы выполняем первый процесс (который "создает новую запись в таблице Заказы, меняет статус бокса в таблице Боксы и тд"). После него добавляем в очередь задачу по проверке API.
Консьюмер получает задачу, проверяет API и, если все ок, то выполняет нужные действия, в противном случае копирует задачу (увеличивая счетчик попыток на один) и через минуту посылает ее в очередь опять. В случае если счетчик уже перевалил за 5, то игнорирует.

Вместо очередей можно создать консольную команду и запускать ее в фоне.
$process = new Process("bin/console app:check-api $orderId > /dev/null 2>&1 &");

В команде уже использовать вариант, предложенный nozzy
Ответ написан
@nozzy
Symfony, Laravel, SQL
$i=1;
while($i<=5) {
   // call api     
   sleep(60);
   $i++;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы