ThinkPHP 8 无内置定时调度器,必须依赖 Linux Cron 每分钟调用 php think schedule:run 扫描执行;若需秒级、可视化或常驻调度,则可选用 think-cron(轻量命令型)、http-crontab(Web 管理型)或 easy-task(进程常驻型)等第三方扩展,均需按规范配置命令类、命名空间及系统级触发机制。

ThinkPHP 8 本身不内置定时调度器,所有“定时”能力都依赖外部触发。官方路线是用 Linux Cron 每分钟调用 php think schedule:run 扫描执行,但若需更灵活、可视化或秒级控制,第三方扩展就成了实用选择。目前主流且稳定可用的有三类:轻量命令封装型、HTTP 接口管理型、独立进程调度型——选哪个,取决于你的部署环境、权限和运维习惯。
think-cron(推荐入门)
这是最贴近 TP 原生风格的扩展,由社区维护成熟,无需额外服务进程,完全复用 ThinkPHP 的命令系统。
- 安装:
composer require yunwuxin/think-cron - 任务类放在
app/task/目录,命名空间为app\task,类必须实现execute()方法 - 配置文件
config/cron.php中定义规则,例如:'clean_cache' => ['app\task\CleanCache', '0 0 * * *'](每天零点执行) - 仍需在服务器上配 Cron:
* * * * * cd /path/to/project && /usr/bin/php think cron:run >> /dev/null 2>&1
优点是零侵入、易调试、与框架生命周期一致;缺点是仍依赖系统 Cron,不能脱离它单独运行。
http-crontab(适合需要后台管理的项目)
提供 Web 界面增删改查任务,支持秒级调度、日志查看、手动触发,本质是把 Cron 表存在数据库里,用 HTTP 请求驱动执行。
立即学习“PHP免费学习笔记(深入)”;
- 安装:
composer require yzh52521/http-crontab guzzlehttp/guzzle - 执行
php think crontab:start启动 HTTP 服务(默认监听 127.0.0.1:9501) - 前端通过 AJAX 或控制器调用
http://127.0.0.1:9501/api/add添加任务 - 注意:需修改
vendor/yzh52521/http-crontab/src/HttpCrontab.php中的数据库连接,指向你项目的实际库
适合内部管理系统、SaaS 多租户场景,但多一层 HTTP 调用链,生产环境需确保该端口不被外网访问,且守护进程要稳(建议用 supervisor 管理)。
easy-task(适合常驻内存、高频率任务)
基于 PHP 进程常驻 + 多协程,可实现毫秒级调度、任务分组、失败重试、状态监控,不依赖系统 Cron,适合订单轮询、IM 心跳、实时数据拉取等场景。
- 安装:
composer require easy-task/easy-task - 新建命令类(如
app/command/OrderCheck.php),execute()中启动 task 实例并注册回调 - 启动方式:
php think task:start;停止:php think task:stop - 运行时会生成 pid 文件和日志,默认路径
runtime/task/,需确保该目录可写
优势是响应快、可控性强;劣势是需管理进程生命周期,上线部署时要加守护脚本,共享主机或容器环境可能受限。
dragonmantank/cron-expression(不是调度器,但很关键)
它不是完整解决方案,而是解析 Cron 表达式的底层工具,几乎所有 TP 第三方定时扩展都依赖它。当你需要自定义判断“某任务是否该此刻执行”,就靠它。
- 安装:
composer require dragonmantank/cron-expression:^3.4.0(适配 PHP 8.2+ 和 TP8) - 用法示例:
$cron = CronExpression::factory('* * * * *');<br>if ($cron->isDue()) { // 执行逻辑 } - 常见用途:配合 Redis 锁做分布式任务去重、在控制器中动态计算下次执行时间、校验用户输入的 Cron 格式
不单独用,但值得装——尤其你要自己造轮子或深度定制调度逻辑时,它是可靠的基础组件。



















