它是如何工作的 ?使用 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。但是,如果您可以使用 Horizo​​n,它会让您更轻松(在花了一天时间了解它之后)。

【讨论】:

以上是关于它是如何工作的 ?使用 Spatie/laravel-cronless-schedule 自定义的 Laravel 时间表的主要内容,如果未能解决你的问题,请参考以下文章

使用空间填充曲线加速全局照明 - 它是如何工作的?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

Kotlin 协程 - 延迟,它是如何工作的?

休眠乐观锁定..它是如何工作的?

使用 DialogFragment 从布局 xml 调用方法。它是如何工作的?

地理位置 - 它是如何工作的?