creatcode / crontab-expression
通用 Unix/Linux Cron 表达式的解析、校验与秒级扩展
v1.5.1
2026-08-21 10:35 UTC
Requires
- php: ^7.2
README
通用 PHP Cron 表达式库,提供表达式解析、校验、执行时间计算与语义化生成能力,并在 Unix/Linux 五段格式基础上提供可选秒字段。
支持以下格式:
分 时 日 月 周:Unix/Linux Cron,内部按秒为0执行。秒 分 时 日 月 周:秒级 Cron。
星期使用 0-7,其中 0 和 7 均表示星期日,1-5 分别表示周一至周五。
支持 *、,、-、/ 以及月份、星期的英文缩写;不支持 Quartz 专属的 ?、L、W、# 和年份字段。在“日期”和“星期”均非 * 时,五段与六段表达式均按 Unix 规则处理:任一字段匹配即可执行。
行为约定
本库只负责表达式处理与执行时间计算,任务注册和实际执行由调用方处理。日期和星期同时受限时,五段与六段表达式均遵循 Linux Cron 的 OR 语义。
安装与使用
composer require creatcode/crontab-expression
use Creatcode\Cronexp\CronExpression; $cron = CronExpression::factory('*/5 * * * *'); $nextRun = $cron->getNextRunDate();
语义化生成 Cron
只需调用一个方法:CronExpression::generate(单位, 间隔, 选项),直接返回 Cron 字符串。默认生成六段表达式;如需计算执行时间,再将结果传给 factory()。
use Creatcode\Cronexp\CronExpression; // 每 5 分钟的第 10 秒执行 $expression = CronExpression::generate('minute', 5, array('second' => 10)); $nextRun = CronExpression::factory($expression)->getNextRunDate();
支持的单位为 second、minute、hour、day、week、month。前四种单位的第二个参数表示间隔;week 和 month 的间隔固定为 1,因为标准 Cron 无法精确表示“每 N 周”或“每 N 月”。
$options 按需传入:second(0-59)、minute(0-59)、hour(0-23)、weekday(0-7)和 day(1-31)。可通过 format 指定输出格式:5 或 6。
// 五段:*/5 * * * * $fivePart = CronExpression::generate('minute', 5, array('format' => 5)); // 六段:0 */5 * * * * $sixPart = CronExpression::generate('minute', 5);
五段格式没有秒字段,因此不能用于 second 调度。
例如,每周一 09:00 执行:
$expression = CronExpression::generate('week', 1, array( 'weekday' => 1, 'hour' => 9 ));
执行回归测试:composer test。
Cron 表达式
| 格式 | 字段 |
|---|---|
| 五段 | 分 时 日 月 周 |
| 六段 | 秒 分 时 日 月 周 |
| 字段 | 允许值 | 特殊字符 |
|---|---|---|
| 秒 | 0-59 | ,、-、*、/ |
| 分 | 0-59 | ,、-、*、/ |
| 时 | 0-23 | ,、-、*、/ |
| 日 | 1-31 | ,、-、*、/ |
| 月 | 1-12、JAN-DEC |
,、-、*、/ |
| 周 | 0-7、SUN-SAT |
,、-、*、/ |
常用示例:
*/5 * * * * # 每 5 分钟
*/5 * * * * * # 每 5 秒
0 */5 * * * * # 每 5 分钟,在第 0 秒执行
5/20 * * * * * # 每分钟的第 5、25、45 秒执行
0 0 9 * * MON-FRI # 工作日每天 09:00 执行