新闻中心

记录团队成长点滴以及对技术、理念的探索,同时我们乐于分享!

Laravel 秒级计划任务扩展包(laravel-cronless-schedule/laravel-short-schedule),无需Cron 计划任务

2020-08-11 09:44:34 分类:技术学堂

Spatie 团队围绕计划任务发布了两个新扩展包: laravel-cronless-schedulelaravel-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