Laravel 提供了许多强大的功能,其中之一便是任务调度(Task Scheduling)。本文将列举在尝试使用 Laravel 任务调度时遇到的问题。

调度逻辑放哪儿?

在 App\Console 目录下有个 Kernel.php 文件,你可以在其中的 schedule 方法中定义各种调度逻辑。
你可以使用 call 方法调用任何方法:

或使用 command 方法调用 Artisan 命令:

或使用 job 方法调用队列:

可不可以调用 Controller?

可以。由于你可以 call 任何方法,所以你当然可以这样:

或者在闭包内操作:

但是不推荐这样调用 Controller,你可以把逻辑放在 Command 内。

如何设置调度的时间

在 call、command 或者 job 方法后面会有像 ->daily() 这样的内容。Laravel 提供使用了许多类似的时间方法来帮助设置精确的调度调度时间。
你也可以直接使用 Cron 表达式:

如何使用 when()?

你可以使用闭包函数。同时可以在闭包中使用 date() 函数更进一步约束时间。

怎么让计划任务跑起来?

在完成调度逻辑后,你需要在 Linux 系统的 crontab 文件中添加定时任务。可以直接使用 Laravel 自带的 Cron:

注意 path-to-your-project 是你项目的路径。
还需要运行 php artisan 命令查看调度任务中的命令是否正确注册。你应该在目录中看到类似的内容:

现在调度任务已经开始按计划的时间排班执行了。
如果你想立即执行调度任务中的命令,可以在项目根目录执行:

成功的话会显示类似内容:

执行 php artisan schedule:run 时报错

确保你的 $command 数组像这样:

以下是错误的:

你也可以这样:

为什么任务没有执行?

  1. 使用 sudo service cron status 命令查看 Cron 是否正在运行。

  2. 使用 crontab -l 命令查看 crontab 中是否正确添加了 Cron 命令。

  3. 使用 php artisan 命令查看任务的 command 是否正确注册。

为什么任务只执行了一次?

确保 cron job 像这样:

前面的 5 个 * 代表每分钟都会执行一次。

另外,确保你任务所调用的方法没有错误。很可能你的方法在执行了大部分操作后报错跳出,从而看上去像是执行完了一次任务。

发表评论

电子邮件地址不会被公开。 必填项已用*标注