elektro-potkan / scheduler
具有锁定功能的强大作业调度器(cron)
Requires
- php: >= 7.2
- dragonmantank/cron-expression: ^3.0.1
- nette/safe-stream: ^2.4
- nette/utils: ^3.0.1
Requires (Dev)
- phpstan/phpstan: ^0.12
- phpstan/phpstan-deprecation-rules: ^0.12
- phpstan/phpstan-nette: ^0.12
- phpstan/phpstan-strict-rules: ^0.12
- tracy/tracy: ^2.3
Suggests
- elektro-potkan/scheduler-console: to use scheduler from console
- elektro-potkan/scheduler-di: to integrate with Nette DI
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));
作者
- 修改版由 Elektro-potkan git@elektro-potkan.cz。
- 原始 Contributte 包作者(见 Composer 配置文件)
信息
版本控制
此项目使用 Semantic Versioning 2.0.0 (semver.org)。
分支
此项目使用略微修改的 Git-Flow 工作流程和分支模型
- https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
- https://nvie.com/posts/a-successful-git-branching-model/
许可证
您可以在MIT许可证的条款下使用此程序。
请参阅文件LICENSE。