dimabzz/laravel-short-schedule
使用分钟以下频率执行Artisan命令的调度
Requires
- php: ^7.4|^8.0
- illuminate/cache: ^7.0|^8.0
- react/event-loop: ^1.1
- spatie/temporary-directory: ^1.2|^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- mockery/mockery: ^1.3.3
- orchestra/testbench: ^5.0|^6.0
- phpunit/phpunit: ^9.0
- spatie/test-time: ^1.2
README
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 Package Training的一部分。
支持我们
我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从您的家乡寄给我们一张明信片,说明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将发布所有收到的明信片在我们的虚拟明信片墙上。
安装
您可以通过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(); }
指定秒数
您可以每秒运行一次工匠命令,就像这样
$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
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全
如果您发现任何与安全相关的问题,请通过电子邮件freek@spatie.be联系,而不是使用问题跟踪器。
鸣谢
许可证
MIT 许可证(MIT)。有关更多信息,请参阅许可证文件。