A
agoalofalife
@agoalofalife_channel249 подп.
454просмотров
2 октября 2025 г.
📷 ФотоScore: 499
Обработка SIGTERM и других сигналов в Laravel командах Сегодня я хотел бы вам рассказать про обработку сигналов из операционной системы. Часто commands, которые пишутся в Laravel, они выполняются по крону или с помощью встроенного демона -> php artisan schedule:work При деплое, в зависимости от того, используете ли вы обычный сервер или Kubernetes, эта команда может прерваться сигналом из операционной системы посередине процесса или даже простым "неаккуратным" нажатим ctr + C Если в это время процесс делает что-то полезное, какой-то сетевой запрос или какую-то запись данных, то может произойти прерывание процесса в тот момент, когда не завершилась атомарная операция. Например, у вас есть какой-то HTTP-запрос неидемпотентный, который создает новую сущность в стороннем приложении. И чтобы сделать операцию атомарной, вам надо сделать HTTP запрос и записать эту сущность в стороннем сервисе и создать какую-то запись у себя. Атомарной операцией в этом случае является: запрос в стороннюю систему и запись у себя в базе данных. Но если посередине процесса прилетит какой-нибудь сигнал и убьет его, то мы можем отправить запрос и не сохранить у себя ничего, и как итог получим неконсистентное состояние между системами. Это один из примеров, но - таких примеров может быть множество. Поэтому при написании команды, которая будет выполняться в фоне, мы должны думать о том, что процесс может по какой-то причине принудительно "убиться". Надо этот сценарий обработать.. Сам Laravel предлагает такой вариант решения в документации Как альтернатива есть такой вариант spatie/laravel-signal-aware-command Но мне нравиться через интерфейс В Symfony есть SignalableCommandInterface, который можно реализовать в Laravel и принудительно заставить разработчика подумать о том, как надо обработать в команде те или иные действия, чтобы данные, которые были в команде или код, который написан, сохраняли атомарность и консистентность. То есть не прерывался посередине процесса, когда надо завершить операцию. Короткий пример кода - я приложил в картинке. Пользуйтесь!
454
просмотров
2070
символов
Нет
эмодзи
Да
медиа

Другие посты @agoalofalife_channel

Все посты канала →
Обработка SIGTERM и других сигналов в Laravel командах Сегод — @agoalofalife_channel | PostSniper