saloodo / scheduler
作业调度包
Requires
- dragonmantank/cron-expression: ^2.0
- symfony/framework-bundle: ~3.0|~4.0
- symfony/lock: ~3.0|~4.0
- symfony/process: ~3.0|~4.0
- symfony/yaml: ~3.0|~4.0
Requires (Dev)
- monolog/monolog: ^1.23
- phpunit/phpunit: ^7.0
- sensio/framework-extra-bundle: ^3.0.2
- symfony/phpunit-bridge: ^3.0
This package is auto-updated.
Last update: 2024-09-21 20:48:54 UTC
README
Saloodo Scheduler 是一个强大的作业调度程序,灵感来自 Laravel Scheduler。它使用不同的 PHP 进程异步运行每个作业。
安装
需要该包
composer require saloodo/scheduler
将包添加到 AppKernel
new Saloodo\Scheduler\SchedulerBundle(),
定义缓存配置
scheduler: cache_driver: 'app_general_cache' cache_store: 'lock_store_provider'
如何向调度器添加作业?
创建作业类
//AppBundle/Jobs/ExpireShipments.php <?php namespace AppBundle\Jobs; use Saloodo\Scheduler\Jobs\AbstractJob; use Saloodo\Scheduler\Jobs\Schedule; class ExpireShipments extends AbstractJob { private $repository; public function __construct(ShipmentRepository $repository) { $this->repository = $repository; } protected function initialize(Schedule $schedule) { //sets the execution of this job to every 5 minutes $schedule ->everyFiveMinutes(); } public function run() { $this->repository->expireShipments(); } }
将创建的作业添加到服务中
AppBundle\Jobs\ExpireShipments: arguments: - '@App/Repository/ShipmentRepository' #Tag them as scheduler.job tags: - { name: scheduler.job}
监听事件
Saloodo Scheduler 默认分发事件。您可以监听或订阅这些事件。
job.scheduler.started
job.scheduler.completed
job.started
job.completed
job.failed
job.skipped
启动调度器
您只需将以下 Cron 条目添加到您的服务器。
* * * * * php /path-to-your-project/bin/console jobs:run >> /dev/null 2>&1
选项
仅在单个服务器上运行
$scheduler->shouldRunOnOnlyOneInstance();
默认情况下,作业将仅在单个实例上执行。这意味着如果有多个实例在同一分钟内触发调度器执行,则将跳过作业。要覆盖此设置并允许在同一分钟内执行相同的作业,请使用 $scheduler->shouldRunOnOnlyOneInstance(false);
作业重叠
$scheduler->canOverlap(false);
默认情况下,作业不能重叠。在开始之前,作业会检查它是否已经在运行。如果作业可以重叠,请使用 $scheduler->canOverlap(true); 覆盖此设置。
注意:当 canOverlap 设置为 false 时,您还可以为作业锁设置 ttl。 ->setTttl(60) //秒数。这在避免在意外系统关闭时错误地锁定任务尤为重要,这可能导致任务被锁定不必要的长时间。
这是锁保留的最大时间。在正常情况下,作业执行后锁会自动释放。
作业频率
$scheduler->everyMinute(); // runs job every minute $scheduler->everyFiveMinutes(); // runs job every 5 minutes $scheduler->everyTenMinutes(); // runs job every 10 minutes $scheduler->everyFifteenMinutes(); // runs job every 15 minutes $scheduler->everyMinutes(23); // runs job every 23 minutes $scheduler->daily()->atHour(17)->atMinute(30); // runs job every day at 17:30 $scheduler->hourly(); // runs job every hour $scheduler->daily(); // runs job every day at 00:00 $scheduler->daily()->atHour(17)->atMinute(30); // runs job every day at 17:30 $scheduler->monthly()->atDay(3); // runs job month, at the 3rd at 00:00 $scheduler->monthly()->atDay(3)->atHour(17)->atMinute(30); // runs job month, at the 3rd at 17:30 $scheduler->setExpression("* 11,17 * * *"); // sets raw expression, runs job every day at 11:00 and 17:00
一起使用
$scheduler->canOverlap(true)->shouldRunOnOnlyOneInstance(false)->everyFiveMinutes();
命令
运行单个作业
您可以通过在应用程序根目录中执行 bin/console jobs:run {id} 或 bin/console jobs:run {fullyQualifiedClassName} 来手动触发单个作业执行。
单个作业总是会执行,因为重叠检查和单个服务器上的运行检查是由 "运行多个作业命令" 执行的。
运行所有作业
要手动触发所有作业,只需运行 bin/console jobs:run。要强制执行所有到期的作业(不检查重叠或单个服务器上的运行),可选地,传递一个 --force 参数。这将跳过单个服务器上的运行检查。
列出作业
要查看定义的作业概述,运行 bin/console jobs:list。
+------------+-----------------------------------------------------+--------------+-------------+--------------------------+
| ID | Class | Expression | Can overlap | Run only on one instance |
+------------+-----------------------------------------------------+--------------+-------------+--------------------------+
| da6f3a6948 | AppBundle\Jobs\JobEvery1Minute | * * * * * | no | yes |
| 26e25dbd48 | AppBundle\Jobs\JobEvery1MinuteThatOverlaps | * * * * * | yes | yes |
| f9dfbec59a | AppBundle\Jobs\JobEvery5Minutes | */5 * * * * | no | yes |
| d2f87097db | AppBundle\Jobs\JobEvery10MinutesRunningInAllServers | */10 * * * * | no | no |
+------------+-----------------------------------------------------+--------------+-------------+--------------------------+
许可证
此包是开源软件,根据 MIT 许可证许可。