这个包将监控你的 Laravel 日程安排。每次计划任务开始、结束、失败或跳过时,它都会向数据库中的日志表写入一个条目。使用list命令可以检查计划任务何时执行。

此套餐还可以将您的日程安排与 Oh Dear 同步。每当计划任务未按时运行或失败时,Oh Dear 都会向您发送通知。
我们投入了大量资源来创建一流的开源包。您可以通过购买我们的一款付费产品来支持我们。
我们非常感谢您从家乡寄给我们一张明信片,并注明您正在使用我们的哪种套餐。您可以在我们的联系页面上找到我们的地址。我们在虚拟明信片墙上发布所有收到的明信片。
您可以通过 Composer 安装该软件包:
composer require spatie/laravel-schedule-monitor如果您需要 Laravel 8 支持,可以使用composer require spatie/laravel-schedule-monitor:^2安装该软件包的 v2。
您必须发布并运行迁移:
php artisan vendor:publish --provider= " SpatieScheduleMonitorScheduleMonitorServiceProvider " --tag= " schedule-monitor-migrations "
php artisan migrate您可以使用以下方式发布配置文件:
php artisan vendor:publish --provider= " SpatieScheduleMonitorScheduleMonitorServiceProvider " --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.com/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 ' ,
' models ' => [
/*
* The model you want to use as a MonitoredScheduledTask model needs to extend the
* `SpatieScheduleMonitorModelsMonitoredScheduledTask` Model.
*/
' monitored_scheduled_task ' => Spatie ScheduleMonitor Models MonitoredScheduledTask::class,
/*
* The model you want to use as a MonitoredScheduledTaskLogItem model needs to extend the
* `SpatieScheduleMonitorModelsMonitoredScheduledTaskLogItem` Model.
*/
' monitored_scheduled_log_item ' => Spatie ScheduleMonitor Models MonitoredScheduledTaskLogItem::class,
],
/*
* Oh Dear can notify you via Mail, Slack, SMS, web hooks, ... when a
* scheduled task does not run on time.
*
* More info: https://ohdear.app/cron-checks
*/
' oh_dear ' => [
/*
* You can generate an API token at the Oh Dear user settings screen
*
* https://ohdear.app/user/api-tokens
*/
' api_token ' => env ( ' OH_DEAR_API_TOKEN ' , '' ),
/*
* The id of the site you want to sync the schedule with.
*
* You'll find this id on the settings page of a site at Oh Dear.
*/
' site_id ' => env ( ' OH_DEAR_SITE_ID ' ),
/*
* To keep scheduled jobs as short as possible, Oh Dear will be pinged
* via a queued job. Here you can specify the name of the queue you wish to use.
*/
' queue ' => env ( ' OH_DEAR_QUEUE ' ),
/*
* `PingOhDearJob`s will automatically be skipped if they've been queued for
* longer than the time configured here.
*/
' retry_job_for_minutes ' => 10 ,
],
];计划监视器将记录所有计划作业的每次启动、完成和失败。一段时间后, monitored_scheduled_task_log_items可能会变大。
使用 Laravel 的模型修剪功能,您可以删除旧的MonitoredScheduledTaskLogItem模型。早于schedule-monitor配置文件中的delete_log_items_older_than_days配置的天数的模型将被删除。
// app/Console/Kernel.php
use Spatie 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 监视器。
如果您想对 Oh Dear 使用非破坏性同步,以便可以监视 Laravel 之外的其他 cron 任务,则可以使用--keep-old标志。这只会将新任务推送到 Oh Dear,而不是完全同步。请注意,这不会删除 Oh Dear 中不再包含在您的日程中的任何任务。
要监控您的日程安排,您应该首先运行schedule-monitor:sync 。此命令将查看您的计划,并为monitored_scheduled_tasks表中的每个任务创建一个条目。

要查看所有受监控的计划任务,您可以运行schedule-monitor:list 。该命令将列出所有受监控的计划任务。它将显示计划任务上次启动、完成或失败的时间。

每次计划任务开始、结束、失败或跳过时,该包都会向数据库中的monitored_scheduled_task_log_items表写入一个条目。如果您想了解计划任务的执行时间和方式,请查看该表的内容。日志项还包含其他有趣的指标,例如内存使用情况、执行时间等。
计划监视器将尝试自动确定计划任务的名称。对于命令,这是命令名称,对于匿名作业,将使用第一个参数的类名称。对于某些任务,例如计划关闭,无法自动确定名称。
要手动设置计划任务的名称,您可以添加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键中。
如果您使用的是 spatie/laravel-multitenancy,您应该将PingOhDearJob添加到config/multitenancy.php中的not_tenant_aware_jobs数组中。
' not_tenant_aware_jobs ' => [
// ...
Spatie ScheduleMonitor Jobs PingOhDearJob::class,
]如果没有它, PingOhDearJob将失败,因为不会设置租户。
这个软件包可以将您的日程安排与 Oh Dear cron 检查同步。每当计划任务未按时完成时,Oh Dear 就会向您发送通知。
首先,您需要安装 Oh Dear SDK。
composer require ohdearapp/ohdear-php-sdk接下来,您需要确保schedule-monitor的api_token和site_id键已填充 API 令牌和 Oh Dear 站点 id。要验证这些值是否包含正确的值,您可以运行此命令。
php artisan schedule-monitor:verify
要将您的日程安排与 Oh Dear 同步,请运行以下命令:
php artisan schedule-monitor:sync
之后, list命令应该显示您的应用程序中的所有计划任务都已在 Oh Dear 上注册。

为了使计划的作业尽可能短,Oh Dear 将通过排队作业进行 ping 操作。为了确保快速交付给 Oh Dear,并避免误报通知,我们强烈建议为这些作业创建专用队列。您可以将该队列的名称放入配置文件的queue键中。
Oh Dear 将等待计划任务完成指定的分钟数。这称为宽限期。默认情况下,所有计划任务都有 5 分钟的宽限时间。要自定义此值,您可以将graceTimeInMinutes添加到计划任务中。
下面是一个示例,如果任务在 00:10 之前未完成,Oh Dear 将发送通知。
// in app/Console/Kernel.php
protected function schedule ( Schedule $ schedule )
{
$ schedule -> command ( ' your-command ' )-> daily ()-> graceTimeInMinutes ( 10 );
}如果您想要由计划监视器而不是 Oh Dear 监视任务,您可以将doMonitorAtOhDear添加到您的计划任务中。
// in app/Console/Kernel.php
protected function schedule ( Schedule $ schedule )
{
$ schedule -> command ( ' your-command ' )-> daily ()-> doNotMonitorAtOhDear ();
}目前,此包不适用于使用这些方法的任务:
betweenunlessBetweenwhenskip我们假设,当您的计划任务无法正常运行时,发送通知的计划任务也可能无法运行。这就是为什么这个包本身不发送通知的原因。
当计划任务未正常运行时,这些服务可以通知您:
composer test 请参阅变更日志以了解有关最近更改内容的更多信息。
详细信息请参阅贡献。
如果您发现有关安全的错误,请发送邮件至 [email protected],而不是使用问题跟踪器。
麻省理工学院许可证 (MIT)。请参阅许可证文件以获取更多信息。