japseyz / laravel-schedule-monitor
监控Laravel应用中的定时任务
Requires
- php: ^8.0
- dragonmantank/cron-expression: ^3.3
- illuminate/bus: ^9.0|^10.0|^11.0
- lorisleiva/cron-translator: ^0.3.0|^0.4.0
- nesbot/carbon: ^2.63|^3.0
- nunomaduro/termwind: ^1.10.1|^2.0
- spatie/laravel-package-tools: ^1.9
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.52
- mockery/mockery: ^1.4
- orchestra/testbench: ^7.0|^8.0|^9.0
- pestphp/pest: ^1.20|^2.34
- pestphp/pest-plugin-laravel: ^1.2|^2.3
- spatie/pest-plugin-snapshots: ^1.1|^2.1
- spatie/phpunit-snapshot-assertions: ^4.2|^5.1
- spatie/test-time: ^1.2
README
在Laravel应用中监控定时任务,并在失败时通知您。
从japseyz/laravel-schedule-monitor分支
安装
您可以通过composer安装此包
composer require japseyz/laravel-schedule-monitor
准备数据库
您必须发布并运行迁移
php artisan vendor:publish --provider="JapSeyz\ScheduleMonitor\ScheduleMonitorServiceProvider" --tag="schedule-monitor-migrations" php artisan migrate
发布配置文件
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="JapSeyz\ScheduleMonitor\ScheduleMonitorServiceProvider" --tag="schedule-monitor-config"
这是已发布配置文件的内容
return [ /* * The schedule monitor will log each start, finish and failure of all scheduled jobs. * After a while the `monitored_scheduled_task_log_items` might become big. * Here you can specify the amount of days log items should be kept. * * Use Laravel's pruning command to delete old `MonitoredScheduledTaskLogItem` models. * More info: https://laravel.net.cn/docs/9.x/eloquent#mass-assignment */ 'delete_log_items_older_than_days' => 30, /* * The date format used for all dates displayed on the output of commands * provided by this package. */ 'date_format' => 'Y-m-d H:i:s', 'notify' => [ 'email' => null, 'queue' => null, 'failed' => true, 'overdue' => true, ], 'models' => [ /* * The model you want to use as a MonitoredScheduledTask model needs to extend the * `JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTask` Model. */ 'monitored_scheduled_task' => JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTask::class, /* * The model you want to use as a MonitoredScheduledTaskLogItem model needs to extend the * `JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTaskLogItem` Model. */ 'monitored_scheduled_log_item' => JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTaskLogItem::class, ], ];
清理数据库
调度监控器将记录所有计划任务的每个开始、完成和失败。经过一段时间后,`monitored_scheduled_task_log_items`可能会变得很大。
使用Laravel的模型修剪功能,您可以删除旧的`MonitoredScheduledTaskLogItem`模型。在`schedule-monitor`配置文件中的`delete_log_items_older_than_days`配置的日期之前创建的模型将被删除。
// app/Console/Kernel.php use JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTaskLogItem; class Kernel extends ConsoleKernel { protected function schedule(Schedule $schedule) { $schedule->command('model:prune', ['--model' => MonitoredScheduledTaskLogItem::class])->daily(); } }
同步调度
每次部署您的应用程序时,您都应该执行`schedule-monitor:sync`命令
php artisan schedule-monitor:sync
在非生产环境中,您应手动运行`schedule-monitor:sync`。您可以使用`schedule-monitor:list`命令验证是否同步正确。
注意:运行同步命令将删除除了应用程序调度以外的所有其他cron监控器。
用法
要监控您的调度,您应该首先运行`schedule-monitor:sync`。此命令将查看您的调度并在`monitored_scheduled_tasks`表中为每个任务创建一个条目。
要查看所有监控的定时任务,您可以运行`schedule-monitor:list`。此命令将列出所有监控的定时任务。它将显示定时任务最后启动、完成或失败的时间。
每当调度任务开始、结束或失败时,该包都会在数据库中的`monitored_scheduled_task_log_items`表中写入一个条目。如果您想了解定时任务何时以及如何执行,可以查看该表的内容。日志项还包含其他有趣的度量,如内存使用、执行时间和更多。
逾期任务
如果您想了解逾期任务,您应将以下内容添加到`app/Console/Kernel.php`文件中。
// app/Console/Kernel.php class Kernel extends ConsoleKernel { protected function schedule(Schedule $schedule) { $schedule->command('schedule-monitor:notify-overdue')->everyFiveMinutes(); } }
任务命名
调度监控器将尝试自动确定一个计划任务的名称。对于命令,这是命令名称;对于匿名作业,将使用第一个参数的类名。对于某些任务,例如计划闭包,无法自动确定名称。
要手动设置计划任务的名称,您可以在任务上附加`monitorName()`。
以下是一个示例。
// in app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command('your-command')->daily()->monitorName('a-custom-name'); $schedule->call(fn () => 1 + 1)->hourly()->monitorName('addition-closure'); }
当您更改任务的名称时,调度监控器将删除具有旧名称的监控器的所有日志项,并使用任务的新的名称创建一个新的监控器。
设置宽限期
当包检测到计划任务的最后执行未按时进行时,`schedule-monitor`列表将以红色背景显示该任务。在此截图图中,名为`your-command`的任务执行得太晚。
如果任务在预定运行时间加上宽限时间后仍未完成,则包将确定该任务运行过晚。你可以将宽限时间视为在正常情况下任务需要完成所需的时间。默认情况下,包为每个任务授予5分钟的宽限时间。
您可以通过在任务上使用graceTimeInMinutes
方法来自定义宽限时间。在以下示例中,为your-command
任务使用了10分钟的宽限时间。
// in app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command('your-command')->daily()->graceTimeInMinutes(10); }
忽略计划任务
您可以通过在安排任务时添加doNotMonitor
来避免计划任务被监控。
// in app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command('your-command')->daily()->doNotMonitor(); }
将输出存储在数据库中
您可以通过在安排任务时添加storeOutputInDb
来存储输出。
// in app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command('your-command')->daily()->storeOutputInDb(); }
输出将存储在monitored_scheduled_task_log_items
表中,在meta
列的output
键中。
当计划任务未能及时完成时接收通知
当计划任务未能及时完成时,此包将自动向您发送电子邮件。要启用此功能,您应在配置文件中设置notify_email
键。
以下是一个示例,如果任务在00:10之前未完成,则会发送通知。
// in app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command('your-command')->daily()->graceTimeInMinutes(10); }
不受支持的方法
目前,此包不适用于使用以下方法的任务
between
unlessBetween
when
skip
测试
composer test
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。