它是如何工作的 ? Laravel 自定义时间表 Spatie/laravel-cronless-schedule

How does it work ? Laravel Schedule Customized with Spatie/laravel-cronless-schedule

我正在使用 laravel 时间表和 Spatie/laravel-cronless-schedule 包。 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:运行-cronless 命令时我的 schedule 命令会发生什么是

$schedule->command('api:metro-send-sms')->everyMinute()->withoutOverlapping();

我有 运行 计划:运行-cronless 在 5 秒的间隔,但这里它在 everyMinute()withoutOverlapping()

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

任何解释将不胜感激。

TL;DR:它可能会按您预期的方式工作。但是根据你的描述我会说你应该使用 Laravels Queues.

如果您声明一个 everyMinute(),实际上这将使 laravel 运行 在每次调用 php artisan schedule:run 时发生此事件。如果您声明它 everyFiveMinutes(),它会在每次调用 schedule:run 时每被 5 整除的一分钟执行命令。 Laravel 调度程序构建为 运行 每分钟一次。

spatie-package,正如它明确指出的那样,是为测试环境而制作的。

Laravel's native scheduler relies on cron to be executed every minute. It's rock solid and in most cases you should stick to using it. I advise you not to use it for production. Also the frequency-argument is obviously ment if you do some testing, to reduce the time you have to wait for an action. Again, you should not depend on it for an production enviroment.

通过使用 withoutOverlapping(),您可以更频繁地 运行 消除一些副作用。它将完成工作,如果前一个工作仍在处理,则不会开始新的工作。

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

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