52 lines
1.4 KiB
PHP
52 lines
1.4 KiB
PHP
|
<?php
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace Mcp\Cron;
|
||
|
|
||
|
use DateInterval;
|
||
|
use DateTime;
|
||
|
use Mcp\Mcp;
|
||
|
|
||
|
abstract class CronJob {
|
||
|
|
||
|
protected Mcp $app;
|
||
|
private Frequency $freq;
|
||
|
|
||
|
public function __construct(Mcp $app, Frequency $freq)
|
||
|
{
|
||
|
$this->app = $app;
|
||
|
$this->freq = $freq;
|
||
|
}
|
||
|
|
||
|
public function getNextRun(int $lastRun)
|
||
|
{
|
||
|
$prevDate = getdate($lastRun);
|
||
|
$res = new DateTime('@'.$lastRun);
|
||
|
switch($this->freq) {
|
||
|
case Frequency::EACH_MINUTE:
|
||
|
$res->add(DateInterval::createFromDateString('1 minute'));
|
||
|
break;
|
||
|
case Frequency::HOURLY:
|
||
|
$res->add(DateInterval::createFromDateString('1 hour'));
|
||
|
break;
|
||
|
case Frequency::DAILY:
|
||
|
$res->add(DateInterval::createFromDateString('1 day'));
|
||
|
break;
|
||
|
case Frequency::WEEKLY:
|
||
|
$res->add(DateInterval::createFromDateString('1 week'));
|
||
|
break;
|
||
|
case Frequency::MONTHLY:
|
||
|
$res->setDate($prevDate['year'] + ($prevDate['mon'] == 12 ? 1 : 0), $prevDate['mon'] == 12 ? 1 : $prevDate['mon'] + 1, 1);
|
||
|
break;
|
||
|
case Frequency::YEARLY:
|
||
|
$res->setDate($prevDate['year'] + 1, 1, 1);
|
||
|
break;
|
||
|
default: break;
|
||
|
}
|
||
|
|
||
|
return $res->getTimestamp();
|
||
|
}
|
||
|
|
||
|
abstract public function run(): bool;
|
||
|
}
|