ThinkPHP6定时任务与访问触发任务本质不同:前者由系统调度器(如crontab)驱动,不依赖请求,准时可靠,适合关键周期操作;后者需HTTP请求触发,受流量影响,易重复或超时,仅适用于非关键轻量任务。

执行来源完全不同
定时任务靠系统级调度器驱动,比如 Linux 的 crontab 或 Windows 任务计划程序,它不依赖任何用户请求,到点就执行,哪怕网站没人访问、服务完全静默,也能准时运行。
访问触发任务则必须等 HTTP 请求进来——通常是用户打开网页、调接口,或爬虫抓取时,框架在某个钩子(如 app_end)里检查时间条件,再决定是否执行。没有访问,它就不会动。
可靠性与稳定性差异大
定时任务由操作系统保障,失败可查日志、可重试、可监控,适合清理缓存、同步数据、发日报这类关键操作。
访问触发任务有三个硬伤:
• 流量低或零访问时,任务永远不跑;
• 高并发下可能重复执行(多个请求同时满足条件);
• 执行超时或报错容易拖慢整个页面响应。
适合的业务类型不一样
定时任务适合:
• 固定周期强要求的操作(如每天 2:00 清理日志);
• 耗时较长的任务(导出报表、批量推送),可配合队列异步处理;
• 需要精确控制执行时间的场景(金融对账、库存校验)。
访问触发任务只适合:
• 低频、非关键、容忍延迟的轻量操作(如偶尔刷新某项统计缓存);
• 共享主机或无法配置 crontab 的受限环境;
• 开发调试阶段临时替代,不能用于生产核心逻辑。
实现方式也泾渭分明
定时任务走命令行入口:
• 写一个继承 think\console\Command 的类;
• 在 configure() 设命令名,execute() 写业务;
• crontab 调用 php think your:command。
访问触发任务走行为钩子:
• 在 app/config/tags.php 绑定行为(如 app_end);
• 新建行为类,在里面读取配置的时间间隔,判断是否该执行;
• 逻辑散在 Web 生命周期中,无独立进程,也不进命令行。



















