nephifey / cron-expression
Cron 表达式解析器,用于获取上次运行日期、下次运行日期,并基于下次运行日期确定表达式是否应该运行。
v1.0.1-alpha
2024-03-29 16:16 UTC
Requires
- php: ^8.3
Requires (Dev)
- phpunit/phpunit: ^11
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