saloodo/scheduler

作业调度包

v1.1.9 2021-01-21 12:27 UTC

README

Latest Version on Packagist Total Downloads Build Status

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 许可证许可。