yuusiro/laravel-short-schedule

使用子分钟频率调度Artisan命令

1.0.2 2023-11-09 11:33 UTC

This package is auto-updated.

Last update: 2024-09-09 13:30:30 UTC


README

Latest Stable Version Tests GitHub Code Style Action Status Total Downloads

Laravel的内置调度器允许您将Artisan命令每分钟调度一次。

如果您需要以更高的频率执行某些操作,例如每秒一次,那么您就来到了正确的包。安装laravel-short-schedule后,您就可以这样做

// in app\Console\Kernel.php

protected function shortSchedule(\Spatie\ShortSchedule\ShortSchedule $shortSchedule)
{
    // this command will run every second
    $shortSchedule->command('artisan-command')->everySecond();
    
    // this command will run every 30 seconds
    $shortSchedule->command('another-artisan-command')->everySeconds(30);
    
    // this command will run every half a second
    $shortSchedule->command('another-artisan-command')->everySeconds(0.5);
    
    // this command will run every second and its signature will be retrieved from command automatically
    $shortSchedule->command(\Spatie\ShortSchedule\Tests\Unit\TestCommand::class)->everySecond();
}

您是视觉学习者吗?

这个视频中,您将看到包的演示。

想知道它是如何工作的吗?那么请观看这个视频

最后,还有一个视频展示了如何测试该包。您将了解如何测试由ReactPHP驱动的循环。

这些视频也是Laravel包培训的一部分。

支持我们

我们在创建最佳开源包上投入了大量资源。您可以通过购买我们的付费产品之一来支持我们。

我们非常感谢您从家乡寄来明信片,说明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将把收到的所有明信片发布在我们的虚拟明信片墙上

安装

您可以通过Composer安装此包

composer require dima-bzz/laravel-short-schedule

在您的生产环境中,您可以使用以下命令启动短期调度器

php artisan short-schedule:run

您应该使用进程监控器(如Supervisor)来确保此任务始终运行,并在服务器启动时自动启动它。每次您更改调度时,都应重新启动此命令。

重启工作守护进程

每次您更改调度或代码时,都应该运行此命令。此命令会发送广播消息来重启工作守护进程。

php artisan short-schedule:restart

运行此命令后,工作进程及其所有子进程将被终止。然后supervisor(或类似监视器)将其恢复。

处理内存泄漏

为了处理泄漏内存的命令,您可以为短期调度器工作进程设置生存时间(秒)

php artisan short-schedule:run --lifetime=60 // after 1 minute the worker will be terminated

经过指定的时间后,工作进程及其所有子进程将被终止,释放所有内存。然后supervisor(或类似监视器)将其恢复。

Lumen

在您的Lumen项目中运行php artisan short-schedule:run命令之前,您应该将ShortScheduleRunCommand的副本复制到您的app/Commands文件夹中

cp ./vendor/dima-bzz/laravel-short-schedule/src/Commands/ShortScheduleRunCommand.php ./app/Console/Commands/ShortScheduleRunCommand.php

接下来,编辑新的ShortScheduleRunCommand.php文件,将命名空间从namespace Spatie\ShortSchedule\Commands;更改为namespace App\Console\Commands;,然后您就可以开始了!

用法

app\Console\Kernel中,您应该添加一个名为shortSchedule的方法。

// in app\Console\Kernel.php

protected function shortSchedule(\Spatie\ShortSchedule\ShortSchedule $shortSchedule)
{
    // this artisan command will run every second
    $shortSchedule->command('artisan-command')->everySecond();
}

指定秒数

您可以每秒运行一个 artisan 命令,方法如下

$shortSchedule->command('artisan-command')->everySecond();

您可以使用 everySeconds 指定特定的秒数。

$shortSchedule->command('artisan-command')->everySeconds(30);

您甚至可以以亚秒频率安排任务。此任务将每半秒运行一次。

$shortSchedule->command('artisan-command')->everySeconds(0.5);

安排 shell 命令

使用 exec 来安排一个 bash 命令。

$shortSchedule->exec('bash-command')->everySecond();

防止重叠

默认情况下,即使之前的调用仍在运行,安排的命令也会运行。

您可以通过添加 withoutOverlapping 来防止这种情况。

$shortSchedule->command('artisan-command')->everySecond()->withoutOverlapping();

时间约束

限制任务在开始和结束时间之间运行。

$shortSchedule->command('artisan-command')->between('09:00', '17:00')->everySecond();

使用溢出天是安全的。在这个例子中,命令将在 21:00 到 01:00 之间的每秒运行。

$shortSchedule->command('artisan-command')->between('21:00', '01:00')->everySecond();

真值测试约束

如果给定的闭包返回一个真值,则命令将运行。闭包将在与命令相同的频率下评估。因此,如果您将命令安排为每秒运行,则给定的闭包也将每秒运行。

$shortSchedule->command('artisan-command')->when(fn() => rand() %2)->everySecond();

环境约束

命令仅在指定的环境中运行。

$shortSchedule->command('artisan-command')->environment('production')->everySecond();

您也可以传递一个数组。

$shortSchedule->command('artisan-command')->environment(['staging', 'production'])->everySecond();

复合约束

您可以使用上述所有约束。只有当所有使用的约束都通过时,命令才会执行。

$shortSchedule
  ->command('artisan-command')
  ->between('09:00', '17:00')
  ->when($callable)
  ->everySecond();

维护模式

当 Laravel 处于维护模式时,命令不会运行。如果您想强制在维护模式下运行命令,可以使用 runInMaintenanceMode 方法。

$shortSchedule->command('artisan-command')->everySecond()->runInMaintenanceMode();

在一个服务器上运行任务

限制命令一次只在一个服务器上运行。

$shortSchedule->command('artisan-command')->everySecond()->onOneServer();

在后台运行

命令将在后台运行。

$shortSchedule->command('artisan-command')->everySecond()->runInBackground();

写入详细到控制台

控制台将写入已执行的命令以及何时执行。它还将写入为什么跳过了命令。

$shortSchedule->command('artisan-command')->everySecond()->verbose();
Execution #1 in 11/25/2020 2:03:33 PM output:
Running command: echo 'called'

Execution #2 in 11/25/2020 2:03:32 PM output:
Skipping command (still is running): echo 'called'

Execution #3 in 11/25/2020 2:05:32 PM output:
Skipping command (system is down): echo 'called'

Execution #4 in 11/25/2020 2:15:32 PM output:
Skipping command (has already run on another server): echo 'called'

事件

响应这些事件时执行任何代码是阻塞的。如果您的代码执行时间较长,所有短期安排的工作都会延迟。我们强烈建议将这些代码放入队列中。

Spatie\ShortSchedule\Events\ShortScheduledTaskStarting

此事件将在任务即将开始之前触发。它具有以下公共属性

  • command: 要执行的命令字符串
  • process: 将用于执行命令的 Symfony\Component\Process\Process 实例

Spatie\ShortSchedule\Events\ShortScheduledTaskStarted

此事件将在任务开始后立即触发。它具有以下公共属性

  • command: 正在执行的命令字符串
  • process: 正在执行命令的 Symfony\Component\Process\Process 实例

Spatie\ShortSchedule\Events\ShortScheduledTaskFinished

此事件将在任务完成后立即触发。它具有以下公共属性

  • command: 正在执行的命令字符串
  • process: 正在执行命令的 Symfony\Component\Process\Process 实例

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全

如果您发现任何安全问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。

鸣谢

许可

MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。