0

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

我已经运行schedule:run-cronless间隔 5 秒,但这里它在everyMinute()withoutOverlapping()

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

任何解释将不胜感激。

4

1 回答 1

1

TL;DR:它可能会按照您期望的方式工作。但是根据您的描述,我会说您应该使用 Laravel Queues

如果您声明 a everyMinute(),实际上这将使 laravel 在每次调用php artisan schedule:run. 如果您声明它everyFiveMinutes(),它将在每次调用schedule:run. Laravel 调度器被构建为每分钟运行一次。

spatie-package,正如它清楚地说明的那样,是为测试环境而设计的。

Laravel 的原生调度器依赖于每分钟执行一次的 cron。它坚如磐石,在大多数情况下你应该坚持使用它。我建议您不要将其用于生产。此外,如果您进行一些测试,频率参数显然是 ment,以减少您必须等待操作的时间。同样,您不应该依赖它来构建生产环境。

通过使用withoutOverlapping(),您将消除更频繁运行它的一些副作用。它将完成这项工作,如果前一个仍在处理中,它将不会启动新的工作。

但是,我认为很明显你在 Laravel 中使用了错误的工具来处理可能很慢的任务。让我们以您的第一个命令api:elite-send-sms为例。我很确定您不想每 5 秒发送一次短信。你想在一个事件中发送它,这就是 Laravel 队列的用途。在事件中,您将向队列分派一个作业,并立即完成请求,而无需等待作业执行。

即使您的环境不能使用 redis 和Laravel Horizo​​n ,您仍然可以使用队列。但是,如果您可以使用 Horizo​​n,它会让您更轻松(在花了一天时间了解它之后)。

于 2021-02-14T10:03:29.510 回答