📜  在自定义 cron 中的 laravel 中调度 - PHP (1)

📅  最后修改于: 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 中,可以使用 onOneServerrunInBackground 等方法来设置任务调度策略,例如:

$schedule->command('check:orders')
         ->cron('0 5 * * 1')
         ->onOneServer()
         ->runInBackground();

在这个例子中,我们使用了 onOneServerrunInBackground 方法来设置任务调度策略,在多台服务器中,只有其中一台服务器会执行任务,并且任务会在后台以守护进程的方式运行。

更多内容

除了上述介绍的高级使用方法之外,Laravel 的任务调度器还提供了很多其他的特性和功能,例如使用 Redis 队列来调度任务、任务输出、故障自愈等。有兴趣了解的读者可以查看 Laravel 的官方文档。

总结

在本文中,我们介绍了在 Laravel 中使用自定义 cron 调度任务的方法及技巧,包括设置 cron 表达式、设置时区偏移量、任务前置条件和任务调度策略等。希望本文对读者在 Laravel 中使用任务调度器有所帮助。