微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

它是如何工作的 ?使用 Spatie/laravel-cronless-schedule 定制的 Laravel Schedule

如何解决它是如何工作的 ?使用 Spatie/laravel-cronless-schedule 定制的 Laravel Schedule

我正在使用带有 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()>

现在我的问题是,可以吗?还是我错了?还是我做了不合逻辑的事情?

任何解释将不胜感激。

解决方法

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,它将使您更轻松(在花了一天的时间了解它之后)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?