mikhailmelnikov / laravel-jobs-monitor
Admin-agnostic core for monitoring Laravel scheduled tasks and database queue jobs: list, run, retry, forget, flush.
Package info
github.com/MikhailMelnikov/laravel-jobs-monitor
pkg:composer/mikhailmelnikov/laravel-jobs-monitor
Requires
- php: ^8.3
- illuminate/console: ^12.0|^13.0
- illuminate/database: ^12.0|^13.0
- illuminate/queue: ^12.0|^13.0
- illuminate/support: ^12.0|^13.0
- illuminate/translation: ^12.0|^13.0
Requires (Dev)
- laravel/pint: ^1.13
- orchestra/testbench: ^10.0|^11.0
- pestphp/pest: ^3.0|^4.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Ядро, не зависящее от админки, для работы с планировщиком Laravel и очередью на базе БД без консоли:
- задачи планировщика с расписанием в понятном виде, временем следующего запуска и признаком «выполняется сейчас» — как
schedule:list; - ручной запуск задачи: отправить её job в очередь или выполнить прямо сейчас;
- обзор очереди (ожидающие / выполняющиеся / отложенные / упавшие, по каждой очереди) и список задач в очереди;
- упавшие задачи с ошибкой, стектрейсом, payload и адресом получателя уведомления;
- повтор, удаление, очистка — как
queue:retry,queue:forget,queue:flush; - журнал всех ручных действий с id пользователя, который их выполнил;
- переводы на английский и русский.
Интерфейса в пакете нет. Используйте интеграцию с админкой:
| Админка | Пакет |
|---|---|
| Backpack for Laravel | mikhailmelnikov/backpack-jobs-monitor |
| Filament | mikhailmelnikov/filament-jobs-monitor |
Требования
- PHP 8.3+
- Laravel 12 или 13
- для страниц очереди — драйвер очереди
database(страницы планировщика работают с любым драйвером)
Установка
composer require mikhailmelnikov/laravel-jobs-monitor
Сервис-провайдер подключается через package discovery. Если вы ставите интеграцию с админкой (например, backpack-jobs-monitor), ядро установится как её зависимость — отдельно его требовать не нужно.
При необходимости опубликуйте конфиг и переводы:
php artisan vendor:publish --tag=jobs-monitor-config php artisan vendor:publish --tag=jobs-monitor-lang
Настройка
config/jobs-monitor.php:
| Ключ | По умолчанию | Назначение |
|---|---|---|
queue_connection |
null |
Подключение очереди, чьи таблицы показываются. null — queue.default, если оно использует драйвер database, иначе database. Имена таблиц и подключение к БД берутся из config/queue.php. |
per_page |
25 |
Размер страницы в списках задач в очереди и упавших задач. |
recipients.enabled |
true |
Определять адрес получателя у упавших уведомлений. |
recipients.attribute |
email |
Атрибут модели, в котором хранится адрес. |
sync_time_limit |
0 |
set_time_limit() для запуска «сейчас»; null — не менять. |
log_channel |
null |
Канал журнала действий. |
actor_guard |
null |
Guard для стандартного ActorResolver. |
Использование (для интеграций)
Каждый сценарий — класс с аргументами конструктора и методом handle(). Зависимости необязательны и берутся из контейнера.
use MikhailMelnikov\JobsMonitor\Enum\RunMode; use MikhailMelnikov\JobsMonitor\Exceptions\JobsMonitorException; use MikhailMelnikov\JobsMonitor\UseCase; $tasks = (new UseCase\GetScheduledTasksHandler())->handle(); // ScheduledTaskDto[] $overview = (new UseCase\GetQueueOverviewHandler())->handle(); // счётчики $queued = (new UseCase\GetQueuedJobsHandler())->handle(); // пагинатор QueuedJobDto $page2 = (new UseCase\GetQueuedJobsHandler(perPage: 50, page: 2))->handle(); // страница явно, без query string $failed = (new UseCase\GetFailedJobsHandler())->handle(); // пагинатор FailedJobDto try { $message = (new UseCase\RunScheduledTaskHandler($taskId, RunMode::QUEUE))->handle(); // также: DeleteQueuedJobHandler($id), RetryFailedJobsHandler([$uuid]), RetryFailedJobsHandler(), // DeleteFailedJobHandler($uuid), FlushFailedJobsHandler() } catch (JobsMonitorException $e) { // ожидаемый отказ (задача пропала, уже выполняется, …): сообщение переведено, его можно показать как предупреждение }
Сценарии-действия возвращают переведённое сообщение об успехе.
Хендлеры не final: их можно унаследовать и подменить в контейнере ($this->app->bind(RetryFailedJobsHandler::class, MyRetryFailedJobsHandler::class)). Интеграция должна создавать хендлеры через контейнер (app()->make(Handler::class, ['id' => $id])), чтобы подмена работала, — так делает backpack-jobs-monitor.
Кто выполнил действие
Ручные действия записываются в журнал с id текущего пользователя, который определяется через MikhailMelnikov\JobsMonitor\Contracts\ActorResolver. Стандартная реализация читает guard из actor_guard. Интеграция с админкой регистрирует свою:
$this->app->bind(ActorResolver::class, MyPanelActorResolver::class);
Безопасность
- Запуск задач и очистка упавших задач — мощные действия, защитите маршруты своей интеграции соответствующим образом.
- Payload разбирается без создания объектов job-классов (
unserializeсо спискомallowed_classes), поэтому вывод упавших задач никогда не выполняет чужой код и не загружает модели.
Тесты
composer install vendor/bin/pest
Лицензия
MIT. См. LICENSE.md.