ThinkPHP 8 定时任务依赖外部 crontab 每分钟调用 php think schedule:run 扫描执行,需显式启用 'scheduling' => true 配置,命令类须置于 app/command/、命名空间为 app\command、通过 setName() 注册,且仅在 production 环境默认生效。

ThinkPHP 7 定时任务依赖内置调度器
ThinkPHP 7 的定时任务默认走框架自带的 think:schedule 命令,该命令启动后会常驻内存、轮询时间并自动触发注册任务,无需外部 crontab 配合。
执行 php think schedule 即可启动守护进程,框架内部用 pcntl_fork 和 usleep 实现毫秒级检查,支持 ->everyFiveSeconds() 这类高频调度。
任务类只需继承 think\Console\Command,在 configure() 中设名,在 execute() 写逻辑,无需额外注册到配置文件。
⚠️ 注意:此模式要求 PHP 启用 pcntl 扩展,且生产环境常因进程意外退出、内存泄漏或信号未捕获导致静默停止——【无日志、无报警、无重拉机制】,运维难度高。
ThinkPHP 8 彻底移除内置调度器
TP8 删除了所有 pcntl 相关代码,think:schedule 命令已不存在,仅保留 think:schedule:run ——它是一个纯“单次扫描器”,不常驻、不轮询、不 fork。
该命令只做一件事:读取当前时间,比对已注册任务的表达式(如 ->everyMinute()),若匹配则立即调用对应命令类的 execute() 方法,然后退出进程。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
这意味着你必须用系统 crontab 每分钟调用一次:*/1 * * * * cd /path && /usr/bin/php think schedule:run,否则任务永远不会触发。
TP8 强制要求在 config/console.php 中显式开启 'scheduling' => true,否则 schedule:run 直接跳过全部任务扫描逻辑。
PHP 8 对定时任务运行时的影响
PHP 8.5.5 移除了 create_function() 和废弃的 each(),TP7 中若存在用字符串动态定义回调的旧定时任务逻辑(如通过配置拼接函数名再 call_user_func),将在 PHP 8.5.5 下直接报 Fatal error 中断执行。
PHP 8 的 JIT 编译对命令类加载有微弱加速,但对定时任务整体吞吐影响可忽略;真正关键的是错误处理机制升级——未捕获异常不再静默吞掉,而是终止当前命令进程并返回非零退出码,crontab 可据此记录失败。
PHP 8.5.5 默认启用 opcache.preload,若 preload 脚本中提前加载了命令类,而后续代码又修改了类定义,将导致 【类定义冲突,require_once 失效,运行时抛出 Fatal error】,必须清空 opcache 或禁用预加载。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










