PHP任务调度器:完全指南
任务调度器(Task Scheduler)是任何基于PHP的Web应用程序的关键工具。它能够自动化执行日常操作:发送邮件推送、清理缓存、生成报告、与外部API同步数据等。与手动运行脚本不同,调度器确保任务无需管理员干预即可及时、可靠地执行。
在PHP中实现调度器的基本方法
在PHP项目中实现任务调度器主要有两种方式:
- 系统cron(Linux/Unix)——使用内置的cron守护进程按计划调用PHP脚本。
- 自定义调度器(Task Scheduler)——直接在PHP代码中通过循环和时间检查实现调度逻辑。
1. 使用PHP的系统cron
这是最常见且最高效的方法。您创建一个执行所需操作的PHP脚本,然后在服务器的crontab中添加一条记录。
用于cron的PHP脚本示例(cron_job.php):
<?php// cron_job.php - 清理过期的会话require_once 'config.php';require_once 'db.php';
$stmt = $pdo->prepare("DELETE FROM sessions WHERE last_activity < NOW() - INTERVAL 1 DAY");$stmt->execute();
// 记录执行日志file_put_contents('logs/cron.log', date('Y-m-d H:i:s') . " - 会话已清理", FILE_APPEND);?>crontab中的记录(每小时执行一次):
0 * * * * /usr/bin/php /var/www/html/cron_job.php2. 基于PHP的自定义Task Scheduler
如果您无法访问系统cron(例如在共享主机上),可以直接在PHP中实现调度器。这需要使用一个特殊的脚本,该脚本在每次访问网站或通过HTTP请求时运行。
简单调度器示例(task_scheduler.php):
<?phpclass TaskScheduler { private $tasks = []; private $lastRunFile = 'last_run.json';
public function addTask($name, callable $callback, $interval) { $this->tasks[] = [ 'name' => $name, 'callback' => $callback, 'interval' => $interval // 以秒为单位 ]; }
public function run() { $lastRun = $this->getLastRunTimes();
foreach ($this->tasks as $task) { $lastTime = $lastRun[$task['name']] ?? 0; if (time() - $lastTime >= $task['interval']) { echo "正在执行任务:{$task['name']}"; call_user_func($task['callback']); $lastRun[$task['name']] = time(); } }
file_put_contents($this->lastRunFile, json_encode($lastRun)); }
private function getLastRunTimes() { if (file_exists($this->lastRunFile)) { return json_decode(file_get_contents($this->lastRunFile), true); } return []; }}
// 使用示例$scheduler = new TaskScheduler();
$scheduler->addTask('send_newsletter', function() { // 发送邮件的逻辑 echo "邮件已发送";}, 3600); // 每小时
$scheduler->addTask('clean_cache', function() { // 清理缓存 array_map('unlink', glob('cache/*.cache')); echo "缓存已清理";}, 86400); // 每天一次
$scheduler->run();?>3. 支持CRON表达式的高级调度器
为了实现更灵活的调度管理,可以添加对经典cron表达式(分钟、小时、日、月、星期)的支持。
cron表达式解析器示例:
<?phpclass CronPar