它是如何工作的 ?使用 Spatie/laravel-cronless-schedule 自定义的 Laravel 时间表
Posted
技术标签:
【中文标题】它是如何工作的 ?使用 Spatie/laravel-cronless-schedule 自定义的 Laravel 时间表【英文标题】:How does it work ? Laravel Schedule Customized with Spatie/laravel-cronless-schedule 【发布时间】:2021-05-17 10:28:30 【问题描述】:我正在使用带有 Spatie/laravel-cronless-schedule 包的 laravel 时间表。 php 7.4 和 Laravel 5.6。
我对它如何处理时间和重叠感到困惑。
到目前为止我已经完成了。
// Noman Command for Send SMS
$schedule->command('api:elite-send-sms')->everyMinute()->withoutOverlapping();
$schedule->command('api:metro-send-sms')->everyMinute()->withoutOverlapping();
// Noman Command for Update Delivery Report
$schedule->command('EliteUpdateDeliveryStatus:updateStatus')->everyMinute()->withoutOverlapping();
$schedule->command('MetroUpdateDeliveryStatus:updateStatus')->everyMinute()->withoutOverlapping();
我已经通过 spatie/laravel-cronless-schedule 运行了这个命令
php artisan schedule:run-cronless --frequency=5
它帮助我以 5 秒的频率连续点击 schedule:run 命令。
现在我想知道,当我运行 schedule:run-cronless 命令时,我的 schedule 命令中会发生什么
$schedule->command('api:metro-send-sms')->everyMinute()->withoutOverlapping();
我以 5 秒的间隔运行了 schedule:run-cronless,但这里是 everyMinute() 和 withoutOverlapping() p>
现在我的问题是,可以吗?还是我错了?还是我做了一些不合逻辑的事情?
任何解释都将受到高度赞赏。
【问题讨论】:
【参考方案1】:TL;DR:它可能会按照您期望的方式工作。但根据你的描述,我想说你应该使用 Laravel Queues。
如果你声明一个everyMinute()
,实际上这将使laravel 在每次调用php artisan schedule:run
时运行这个事件。如果您将其声明为everyFiveMinutes()
,它将在每次调用schedule:run
时每分钟执行一次可被5 整除的命令。 Laravel 调度程序被构建为每分钟运行一次。
spatie-package,正如它明确指出的那样,是为测试环境而设计的。
Laravel 的原生调度程序依赖于每分钟执行一次的 cron。它坚如磐石,在大多数情况下你应该坚持使用它。 我建议您不要将其用于生产。此外,如果您进行一些测试,频率参数显然是 ment,以减少您必须等待操作的时间。同样,您不应该依赖它来构建生产环境。
通过使用withoutOverlapping()
,您将消除更频繁运行它的一些副作用。它将完成工作,如果前一个仍在处理中,则不会启动新的。
但是,我认为很明显你在 Laravel 中使用了错误的工具来处理可能很慢的任务。让我们以您的第一个命令api:elite-send-sms
为例。我很确定您不想每 5 秒发送一次短信。你想在一个事件中发送它,这就是 Laravel 队列的用途。在事件中,您将dispatch 一个作业加入队列,并立即完成请求,而无需等待作业执行完毕。
你仍然可以使用队列,即使你的环境不能使用redis和Laravel Horizon。但是,如果您可以使用 Horizon,它会让您更轻松(在花了一天时间了解它之后)。
【讨论】:
以上是关于它是如何工作的 ?使用 Spatie/laravel-cronless-schedule 自定义的 Laravel 时间表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?