📅  最后修改于: 2023-12-03 15:08:05.973000             🧑  作者: Mango
cron
中的 Laravel 中调度在 Laravel 中,我们可以使用调度器(Scheduler)来设置定时任务,例如每分钟执行一次指定命令。但是有时候我们需要自定义 cron
表达式来精确地设置任务的执行时间。
本文将介绍如何在 Laravel 中使用自定义 cron
来调度任务,并提供一些使用的技巧和注意事项。
cron
在 Laravel 中,我们可以使用 cron
方法来设置自定义 cron
表达式。例如下面的代码就是设置每个星期一的凌晨 5 点执行任务:
$schedule->command('check:orders')
->cron('0 5 * * 1');
其中,cron
方法的参数就是自定义的 cron
表达式。在这个例子中,它表示:
0
: 代表分钟,设置为 0
表示每小时的第 0 分钟执行。5
: 代表小时,设置为 5
表示凌晨 5 点执行。*
: 代表每个月的所有天。1
: 代表周几,设置为 1
表示周一。可以看到,使用自定义 cron
很容易,只需要按照 cron
表达式的格式传入参数即可。下面我们来介绍一些常见的 cron
表达式及其含义。
cron
表达式在 cron
中,可以使用一些通配符来表示多个值。下面是一些常见的 cron
表达式及其含义:
*
: 代表所有值,例如 * * * * *
表示每分钟都执行。1-5
: 代表 1~5 这些值,例如 0 8 * * 1-5
表示在每周一到周五的 8 点执行。*/2
: 代表每隔 2 个单位,例如 */5 * * * *
表示每隔 5 分钟执行一次。0
: 代表某个具体的值,例如 0 0 1 * *
表示在每月的 1 日凌晨 0 点执行。需要注意的是,cron
表达式的格式是固定的,如果不按照规则来编写,任务很可能无法正常执行。
在默认情况下,Laravel 使用的是 UTC 时间来调度任务,而不是本地时间。如果需要在本地时间下进行调度,可以使用 timezone
方法来设置时区偏移量,例如:
$schedule->command('check:orders')
->cron('0 5 * * 1')
->timezone('Asia/Shanghai');
这个例子中,我们将时区偏移量设置为上海时区,任务会在上海时间每周一的凌晨 5 点执行。
有时候,我们需要在任务执行之前进行某些前置条件的检查,例如检查外部依赖是否准备就绪。在 Laravel 中,可以使用 when
方法设置任务的前置条件,例如:
$schedule->command('check:orders')
->cron('0 5 * * 1')
->when(function () {
// some check
return true;
});
在这个例子中,我们使用匿名函数来进行任务前置条件的检查,如果这个函数返回 false
,任务就会被取消,不会执行。
Laravel 提供了多种任务调度策略来满足不同的需求,例如在服务提供商启动之后执行任务,或者只在生产环境下执行任务等。在 Laravel 中,可以使用 onOneServer
、runInBackground
等方法来设置任务调度策略,例如:
$schedule->command('check:orders')
->cron('0 5 * * 1')
->onOneServer()
->runInBackground();
在这个例子中,我们使用了 onOneServer
和 runInBackground
方法来设置任务调度策略,在多台服务器中,只有其中一台服务器会执行任务,并且任务会在后台以守护进程的方式运行。
除了上述介绍的高级使用方法之外,Laravel 的任务调度器还提供了很多其他的特性和功能,例如使用 Redis 队列来调度任务、任务输出、故障自愈等。有兴趣了解的读者可以查看 Laravel 的官方文档。
在本文中,我们介绍了在 Laravel 中使用自定义 cron
调度任务的方法及技巧,包括设置 cron
表达式、设置时区偏移量、任务前置条件和任务调度策略等。希望本文对读者在 Laravel 中使用任务调度器有所帮助。