elektro-potkan/scheduler

具有锁定功能的强大作业调度器(cron)

v1.0.0 2021-10-07 06:38 UTC

This package is auto-updated.

Last update: 2024-09-07 11:16:24 UTC


README

简化PHP应用程序定期作业的运行。只需将所有作业注册到调度器,然后通过单次调用在指定时间运行它们。

基于 contributte/scheduler 的重修改版。

原始包重新组织 - 作业移动到单独的命名空间以及调度器。

控制台和Nette DI集成拆分为单独的包。运行 composer suggests 获取更多信息。

用法

捆绑的作业使用 cron 语法

示例

// init
$scheduler = new ElektroPotkan\Scheduler\Schedulers\LastCheck('path-to-directory-for-storing-locks-and-timestamp');

$scheduler->add(new ElektroPotkan\Scheduler\Jobs\Callback('0 3 * * *',// daily at 3:00 a.m.
	function(): void {
		do_something();
	}
));

// run periodically - optimaly each minute, but heavily depends on Your needs and configured jobs
$scheduler->run();

cron 语法

见下文描述。您还可以使用 crontab.guru 验证您的cron。

  *  *  *  *  *
  -  -  -  -  -
  |  |  |  |  |
  |  |  |  |  |
  |  |  |  |  +----- day of week (0 - 7) (Sunday=0 or 7)
  |  |  |  +---------- month (1 - 12)
  |  |  +--------------- day of month (1 - 31)
  |  +-------------------- hour (0 - 23)
  +------------------------- min (0 - 59)

调度器

此包中提供的所有调度器都在命名空间 ElektroPotkan\Scheduler\Schedulers 中。

可用调度器的列表 - 下一个扩展了上一个,因此它也提供了所有以前的特性。

  • 简单
    • 调度器最基本的实现。
    • 不需要任何存储。
    • 如果每分钟不调用,作业的请求运行时间可能会错过。
    • 运行作业时没有提供锁定,所以如果并发调用,作业也将并发运行。
  • 锁定
    • 运行作业时使用锁定,所以如果并发调用,如果另一个实例正在运行作业,它将跳过该作业。
    • 需要目录来存储锁定。
  • LastCheck
    • 为作业提供 $lastCheck 时间戳。
    • 如果每分钟不调用,作业可能会使用此类信息在下一个调用时运行。即使不在确切时间调用,也能消除错过作业运行时间的问题。此包提供的所有作业都支持此功能。
  • LastRun
    • 最先进的调度器类型,为每个作业提供其 $lastRun 时间戳。
    • 此包提供的作业未使用此功能,因为它们不需要。

作业

此包提供2个基本作业(位于命名空间 ElektroPotkan\Scheduler\Jobs 中)

  • Callback - 运行给定的回调。
  • AExpression - 提供cron语法支持的抽象类。

回调作业

如果您需要调用类实例 $myClass 的方法 myClassMethod,只需使用 Callback 作业

// run each minute by cron syntax
$job = new ElektroPotkan\Scheduler\Jobs\Callback('* * * * *', [$myClass, 'myClassMethod']);
$scheduler->add($job);

自定义cron语法作业

为了使您的作业更灵活,但轻松使用 cron 语法,请扩展 AExpression 作业

class MyCronJob extends ElektroPotkan\Scheduler\Jobs\AExpression {
	private $myDataSource;
	
	
	public function __construct(string $cron, $myDataSource){
		parent::__construct($cron);
		$this->myDataSource = $myDataSource;
	}
	
	public function run(): void {
		$this->myDataSource->runSomePeriodicTask();
	}
}

$job = new MyCronJob('0 0 * * 1', $myDataSource);// run each Monday at midnight
$scheduler->add($job);

自定义作业

为了使您的作业完全自由,只需实现 ElektroPotkan\Scheduler\IJob 接口

class MyJob implements ElektroPotkan\Scheduler\IJob {
	private $dateService;
	
	private $statisticsService;
	
	
	public function __construct($dateService, $statisticsService){
		$this->dateService = $dateService;
		$this->statisticsService = $statisticsService;
	}
	
	public function isDue(
		DateTimeInterface $now,
		?DateTimeInterface $lastCheck = null,
		?DateTimeInterface $lastRun = null
	): bool {
		return $this->dateService->isRightTime($now);
	}
	
	public function run(): void {
		$this->statisticsService->calculate();
	}
}

日志记录

要记录内置调度器的信息和错误,您需要通过 setLogger 调用提供 ElektroPotkan\Scheduler\ILogger 接口的实现

// $logger implements ElektroPotkan\Scheduler\ILogger
$scheduler->setLogger($logger);

如果您使用 Tracy,您可以使用提供的 TracyLogger

// $logger implements Tracy\ILogger
$scheduler->setLogger(new ElektroPotkan\Scheduler\TracyLogger($logger));

作者

信息

版本控制

此项目使用 Semantic Versioning 2.0.0 (semver.org)

分支

此项目使用略微修改的 Git-Flow 工作流程和分支模型

许可证

您可以在MIT许可证的条款下使用此程序。

请参阅文件LICENSE