ThinkPHP 6 定时任务依赖需通过外部状态校验实现,如文件标记、数据库记录、Redis键值或日志内容判断前置条件;推荐用Shell脚本串联检查与执行,PHP命令内轻量验证,避免sleep阻塞和内存共享,确保每次运行独立可靠。

ThinkPHP 6 的定时任务本身不提供原生的“任务依赖”机制(比如 A 任务必须等 B 任务成功后再执行),但可通过组合命令、状态标记、日志判断和 Shell 脚本控制,实现可靠的任务依赖管理。关键不是强行模拟 DAG,而是用轻量、可验证、易排查的方式保障执行顺序与前置条件。
依赖的本质是「前置条件校验」
所谓“依赖”,实际就是:当前任务是否允许运行,取决于某个外部状态是否满足。这个状态可以是:
- 上一个任务的日志中是否包含成功标识(如 "done:20260806")
- 数据库某张表里是否存在特定标记记录(如 task_status 表中 sync_order = 'success')
- 某个临时文件是否存在且未过期(如 runtime/flag/order_sync.done)
- Redis 中某个 key 的值为 1 或对应时间戳早于当前时间
用命令链+Shell脚本控制执行顺序
在 crontab 中不直接调用多个命令,而是封装成一个 shell 脚本,按需检查、跳过或阻断:
- 脚本开头先检查前置任务是否完成:if [ ! -f runtime/flag/backup.done ]; then echo "Backup not done, skip sync"; exit 0; fi
- 支持超时等待(谨慎使用):timeout 300 bash -c 'while [ ! -f runtime/flag/backup.done ]; do sleep 10; done'(最多等5分钟)
- 执行主任务后写标记:php think sync:order && touch runtime/flag/sync_order.done
- 日志统一追加上下文:echo "[$(date)] sync:start" >> runtime/log/dependency.log
在 PHP 命令类内做轻量级依赖判断
不推荐复杂调度逻辑,但可在 execute() 开头快速验证必要条件:
立即学习“PHP免费学习笔记(深入)”;
- 查数据库确认前置任务状态:$status = Db::name('task_log')->where('name', 'backup:data')->latest('created_time')->value('status');,仅当 $status === 'success' 才继续
- 读取上一次执行时间,防止间隔太短:$last = Cache::get('last_backup_time'); if (time() - $last writeln('Skip: backup ran less than 1h ago'); return 0; }
- 用 Log::channel('cli') 记录依赖检查结果,避免静默跳过
避免常见陷阱
- 别用 sleep 等待依赖就绪 —— CLI 任务不应阻塞,超时应主动退出,由下一轮 cron 重试
- 别跨命令共享变量或内存状态 —— 每次执行都是全新进程,只依赖持久化介质(文件/DB/Redis)
- 标记文件或 DB 记录必须带时间戳或唯一 ID —— 防止因任务卡死、重复触发导致误判
- crontab 调用时务必 cd 到项目根目录 —— 否则 runtime/flag/xxx.done 路径会错位



















