Часто бывает, что команда не успевает закончить работу, а менеджер (будь то cron или обёртка в виде supervisor) запускает ещё один экземпляр. Со временем пулл процессов накапливается, и возникает неприятная вещи - взаимные блокировки, утечки памяти и на выходе если и не фаталы, то дубли в базе обеспечены.
Решение - подключаем трейт
LockableTrait, и ставим проверку в начале команды:if (!$this->lock()) {
$output->writeln('The command is already running in another process.');
return Command::SUCCESS;
}
В рамках одного сервера и общей памяти это позволит не дублировать процессы.В целом Lock Component позволяет использовать различные адаптеры, от Redis'а до семафоров, реализованных в PHP (https://www.php.net/manual/en/book.sem.php). Беру на вооружение :)