PHP任务调度器:类似cron的PHP队列管理器

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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:00


3. 使用间隔代替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                    

推荐