PHP任务调度器:在代码中管理周期性任务
在现代Web开发中,经常需要执行重复性操作:发送邮件简报、清理缓存、生成报告、与外部API同步数据。传统上,这需要使用系统cron(crontab),但它需要访问shell并在服务器上进行配置。PHP任务调度器(Task Scheduler)库允许直接在PHP应用程序中实现类似cron的行为,而无需编辑crontab。这是共享主机、容器环境(Docker)或需要从代码中灵活调度逻辑的项目的理想解决方案。
主要功能
该库提供了流畅的接口来定义任务及其调度。关键功能包括:
- 灵活的调度定义 – 支持cron表达式、间隔(每N分钟、小时、天)、特定时间(每天03:00)。
- 执行命令和回调函数 – 可以运行shell命令、类方法或匿名函数。
- 队列管理 – 与队列(例如RabbitMQ、Redis)集成,实现延迟执行。
- 日志记录和通知 – 内置执行日志支持,通过电子邮件或Sentry发送错误。
- 安全性 – 防止同一任务并行运行(互斥锁)。
安装和配置
通过Composer安装:
composer require vendor/task-scheduler安装后,需要创建一个scheduler.php文件,该文件将由系统cron(每分钟一次)触发。在文件内部配置所有任务:
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use Scheduler\\Scheduler;use Scheduler\\Task;
$scheduler = new Scheduler();
// 任务1:每30分钟清理缓存$scheduler->add(new Task('cache:clear', function() { // 清理缓存的逻辑 echo "Cache cleared at " . date('Y-m-d H:i:s') . PHP_EOL;}), '*/30 * * * *');
// 任务2:每天9:00发送邮件简报$scheduler->add(new Task('send:newsletter', 'php artisan newsletter:send'), '0 9 * * *');
// 任务3:每5分钟更新统计信息,但每10分钟最多执行一次$scheduler->add(new Task('update:stats', function() { // 耗时操作 sleep(5);}), '*/5 * * * *', [ 'mutex' => true, // 防止并行运行 'timeout' => 300 // 最大执行时间(5分钟)]);
$scheduler->run();?>在系统crontab中添加一行:
* * * * * php /path/to/scheduler.php >> /dev/null 2>&1现在,PHP脚本将每分钟运行一次,并检查哪些任务需要执行。
使用示例
1. 带回调的简单调度器
<?php$scheduler->add(new Task('greet', function() { echo "Hello, World!";}), '*/1 * * * *'); // 每分钟2. 运行Laravel的Artisan命令
<?php$scheduler->add(new Task('reports:generate', 'php artisan reports:generate --force'), '0 2 * * 1'); // 每周一凌晨2:003. 使用间隔代替cron
<?phpuse Scheduler\\Interval;
$scheduler->add(new Task('backup:db', 'mysqldump -u root db > backup.sql'), Interval::everyHour());// 或$scheduler->add(new Task('cleanup:logs', 'rm -rf /var/log/old/*'), Interval::everyDays(7));4. 通过队列延迟执行
<?php$scheduler->add(new Task('process:payments', function() use ($queue) { $queue->push(new