Spatie 团队围绕计划任务发布了两个新扩展包: laravel-cronless-schedule 和 laravel-short-schedule。尽管这两个扩展包具有不同的使用情形,但它们之间的相关性足以让我们在一篇文章中进行分享。
通常,原生 Laravel 调度就可以为大多数应用程序提供足够的灵活性,但是,当你需要运行的计划任务的频率超过每分钟时,这些扩展包就可以提供更出色的开发流程和一些高级功能。
不需要 Cron 的计划任务
laravel-cronless-schedule 扩展包使用了 ReactPHP 循环来运行无需 cron 的计划任务。如果你在本地开发,那么无需事先设置 cron 定时任务,而只用运行如下命令就可以开启计划任务了:
php artisan schedule:run-cronless
根据文档描述,“此命令将永远不会结束。 它将在后台每分钟执行一次 php artisan Schedule。”
Freek Van der Herten 在他的博客文章中解释说,一种无需依赖 cron 即可运行 Laravel 调度程序的软件包 , 为什么要考虑在开发工作流程中使用此软件包:
如果要在本地环境中每分钟运行一次计划任务,使用 cron 可能很麻烦。 我敢打赌,大多数开发人员永远都不会碰他们本地环境的 crontab。所以推出了它,可以很好地运行,但是它不像运行 artisan 命令那样简单 spatie/laravel-cronless-schedule 提供。
在 Windows 上,甚至不存在 cron(我不是专家,但是您应该在其中使用 Windows Scheduler)。 在 Docker 容器上,cron 通常不可用。
该软件包避免了所有特定于平台的调度问题,并且还包含一些有用的参数:
# 每五秒运行一次 php artisan schedule:run-cronless --frequency=5 # 运行一个自定义命令 php artisan cronless-schedule:run --command=your-favorite-artisan-command # 5秒后停止运行 php artisan cronless-schedule:run --stop-after-seconds=5
Laravel 秒级定时任务
Spatie 发布的第二个软件包是 laravel-short-schedule,它可以在秒级频率下运行 Laravel 调度程序。 与 cronless-schedule 程序包类似,它使用 ReactPHP 事件循环。
这是您可以通过在应用程序的控制台内核类上定义 shortSchedule() 方法来使用此程序包的示例:
use \Spatie\ShortSchedule\ShortSchedule; protected function shortSchedule(ShortSchedule $shortSchedule) { // 此命令每秒钟会运行一次 $shortSchedule->command('artisan-command')->everySecond(); // 此命令每30秒会运行一次 $shortSchedule->command('another-artisan-command')->everySeconds(30); // 此命令每0.5秒会运行一次 $shortSchedule->command('another-artisan-command')->everySeconds(0.5); }
像原生 Laravel 调度程序一样,您可以将命令调度为两次运行,并在任务仍在运行时避免任务重叠。
您可以通过查看 Freek 的博客文章来了解有关此软件包的更多信息:用于秒级定时任务运行 Artisan 命令的软件包. 。 您可以在 GitHub 上的源代码中找到 spatie/laravel-short-schedule。