如何解决它是如何工作的 ?使用 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。但是,如果您可以使用 Horizon,它将使您更轻松(在花了一天的时间了解它之后)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。