nephifey/cron-expression

Cron 表达式解析器,用于获取上次运行日期、下次运行日期,并基于下次运行日期确定表达式是否应该运行。

v1.0.1-alpha 2024-03-29 16:16 UTC

This package is auto-updated.

Last update: 2024-09-09 02:34:13 UTC


README

Cron 表达式解析器,用于获取上次运行日期、下次运行日期,并基于下次运行日期确定表达式是否应该运行。此实现支持分钟、小时、月份中的天数、月份和星期的属性,并且仅支持有限数量的非标准字符/宏,请参阅下面的Cron 表达式格式

Cron 表达式格式

如果需要,请参考Cron 维基百科页面,其中大部分内容都来自那里,但请注意,这个库并不支持维基百科中记录的所有功能。

# ┌───────────── minute (0–59)
# │ ┌───────────── hour (0–23)
# │ │ ┌───────────── day of the month (1–31)
# │ │ │ ┌───────────── month (1–12)
# │ │ │ │ ┌───────────── day of the week (0–6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

支持的字符

支持的非标准文字

支持的非标准宏

入门

使用以下命令通过 composer 将包安装到您的项目中。

composer require nephifey/cron-expression

使用方法

基本示例

解析 Cron 表达式并获取上次运行日期、下次运行日期,或检查表达式是否应该运行。

require_once "vendor/autoload.php";

$parser = new \CronExpression\Parser();
$expression = $parser->parse("* * * * *");

$isDue = $expression->isDue();
$nextDateFormatted = $expression->getNextRunDate()->format("Y-m-d H:i:s");
$prevDateFormatted = $expression->getPrevRunDate()->format("Y-m-d H:i:s");

echo "Is Due: " . ($isDue ? "Yes" : "No") . "\r\n";
echo "Next Date: {$nextDateFormatted}\r\n";
echo "Prev Date: {$prevDateFormatted}\r\n";

if ($expression->isDue()) {
    echo "-- Run important code here --\r\n";
}

调度程序示例

将其用作 crontab 的替代品,以在代码库或数据库中保留表达式。

Crontab 设置

* * * * * apache php crontab.php > /dev/null 2>&1

代码库设置

# crontab.php
require_once "vendor/autoload.php";

$jobs = [
    "* * * * *" => [
        function () { echo "-- Run important code here every minute --\r\n"; },
        function () { echo "-- Run important code here every minute #2 --\r\n"; },
    ],
    "*/5 * * * *" => [
        function () { echo "-- Run important code here every five minutes --\r\n"; },
    ],
];

foreach ($jobs as $expression => $callables) {
    $parser = $parser ?? new \CronExpression\Parser();
    if ($parser->parse($expression)->isDue())
        $combinedCallables = array_merge(($combinedCallables ?? []), $callables);
}

foreach (($combinedCallables ?? []) as $callable) {
    call_user_func($callable);
}

其他示例

您可以将自定义日期时间传递给 isDue 方法而不是当前日期时间/时区。此外,您还可以启用严格模式,那么它必须与确切的日期时间/时区匹配。

require_once "vendor/autoload.php";

$parser = new \CronExpression\Parser();
$expression = $parser->parse("* * * * *", new DateTime("now", new DateTimeZone("America/Chicago")));

$isDue = $expression->isDue();
echo "Is Due: " . ($isDue ? "Yes" : "No") . "\r\n"; // Yes

$isDue = $expression->isDue(new DateTime("now", new DateTimeZone("America/New_York")));
echo "Is Due: " . ($isDue ? "Yes" : "No") . "\r\n"; // Yes

$isDue = $expression->isDue(new DateTime("now", new DateTimeZone("America/New_York")), true);
echo "Is Due: " . ($isDue ? "Yes" : "No") . "\r\n"; // No

您可以在稍后基于新的日期时间/时区直接在表达式对象上重新解析 Cron 表达式。这可以是可变的或不可变的,具体取决于您的需求。

require_once __DIR__ . "/vendor/autoload.php";

$parser = new \CronExpression\Parser();
$expression = $parser->parse("* * * * *", new DateTime("now", new DateTimeZone("America/Chicago")));

echo "{$expression->getNextRunDate()->format("Y-m-d H:i:s")}\r\n"; // current time

$expression->reparse(new DateTime("now +1 minute", new DateTimeZone("America/Chicago")));

echo "{$expression->getNextRunDate()->format("Y-m-d H:i:s")}\r\n"; // one minute ahead

$newExpression = $expression->reparseImmutable(new DateTime("now +2 minute", new DateTimeZone("America/Chicago")));

echo "{$expression->getNextRunDate()->format("Y-m-d H:i:s")}\r\n"; // one minute ahead
echo "{$newExpression->getNextRunDate()->format("Y-m-d H:i:s")}\r\n"; // two minutes ahead