PHP任务调度器:cron-expression库
在开发PHP Web应用程序时,经常需要按计划执行特定操作:发送通知、清理缓存、生成报告或同步数据。Linux内置的cron是一个强大的工具,但其配置需要访问服务器,并且对于PHP代码内部的动态调度来说并不总是方便。cron-expression库解决了这个问题——它允许直接在PHP中解析、验证和计算基于CRON表达式的任务执行时间。
在本文中,我们将介绍如何安装和使用cron-expression库,编写一个简单的任务调度器,并探讨实际场景中的示例。
什么是cron-expression?
cron-expression是一个用于处理CRON表达式的PHP库。CRON表达式是一个由五个空格分隔的字段组成的字符串:
* * * * *| | | | || | | | +---- 星期几 (0–7) (星期日 = 0 或 7)| | | +------ 月份 (1–12)| | +-------- 日期 (1–31)| +---------- 小时 (0–23)+------------ 分钟 (0–59)例如,表达式30 4 * * 1-5表示:“每个工作日凌晨4:30”。该库允许:
- 检查当前时间是否与给定表达式匹配。
- 获取任务的下一次执行日期。
- 计算上一次执行日期。
- 处理范围、步长和值列表。
安装
通过Composer进行安装。在项目根目录打开终端并执行:
composer require mtdowling/cron-expression安装后,在您的PHP脚本中引入Composer的自动加载:
require 'vendor/autoload.php';主要功能与示例
1. 检查当前时间
假设我们想每15分钟执行一次任务。CRON表达式:*/15 * * * *。创建一个对象并检查是否应立即启动任务:
<?phpuse Cron\\CronExpression;
$expression = CronExpression::factory('*/15 * * * *');if ($expression->isDue()) { echo "任务现在应该执行!";} else { echo "时间还没到。";}?>isDue()方法检查当前时间是否与表达式匹配。默认使用服务器的时区。
2. 获取下一次执行日期
有时需要提前知道任务何时运行:
<?phpuse Cron\\CronExpression;
$expression = CronExpression::factory('0 6 * * 1-5'); // 每个工作日早上6:00$nextRun = $expression->getNextRunDate();echo "下一次运行: " . $nextRun->format('Y-m-d H:i:s');?>结果:下一次运行: 2025-03-10 06:00:00(如果今天是星期五,则下一个星期一)。
3. 上一次执行日期
getPreviousRunDate()方法返回条件最后一次满足的时刻:
<?php$prevRun = $expression->getPreviousRunDate();echo "上一次运行: " . $prevRun->format('Y-m-d H:i:s');?>4. 处理时区
默认使用服务器的时区,但您可以设置自己的时区:
<?php$expression = CronExpression::factory('0 9 * * *');$expression->setTimezone(new DateTimeZone('Europe/Moscow'));if ($expression->isDue()) { echo "莫斯科现在是9:00——该行动了!";}?>创建简单的任务调度器
现在,我们将所有内容整合在一起,编写一个小型类,该类将按计划执行任务。假设我们有一个包含CRON表达式和回调函数的任务列表。
<?phpclass