ThinkPHP8队列必须禁用sync驱动才能异步执行,需将config/queue.php中'default'改为'redis'或'database'并配全连接参数,否则任务同步执行且无日志、异常不捕获、$job方法失效。

ThinkPHP8队列必须禁用sync驱动才能异步执行
你在TP8中调用Queue::push()后页面秒回、日志没输出、数据库没变化,不是业务逻辑写错了,而是config/queue.php里'default' => 'sync'还在生效——这会让任务当场同步执行,且不记录、不捕获异常、$job->delete()和$job->release()全部失效。
打开config/queue.php,把'default'值从'sync'改成'redis'或'database'。
【必须同时配置connections.redis下的host、port、database三项,ThinkPHP 8.0+不再读取predis全局配置】
改完立刻测试:在任务类fire()方法开头加sleep(3),刷新页面。如果HTTP响应时间仍为毫秒级,说明还没切成功;如果卡住3秒,证明仍在sync模式下假异步。
TP8定时任务只触发,队列专管执行可靠性
ThinkPHP 8自身不提供常驻内存的调度器,必须依赖系统级crontab调用think命令触发。你写的命令类(如app\command\SyncOrderCommand)只封装业务逻辑,不负责轮询、重试或并发控制。
crontab条目要写绝对路径:例如* * * * * /www/server/php/74/bin/php /var/www/myapp/think sync:order >> /tmp/cron-sync.log 2>&1
必须显式切换工作目录,否则自动加载和配置会失效;日志重定向不可省略,否则失败无迹可寻。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
think schedule:run不是守护进程——它只检查当前时间点该执行哪些任务,且默认仅在APP_ENV=production下生效;开发调试需加APP_ENV=local php think schedule:run -v
PHP 7.4环境无法运行TP8队列任务
执行php -v,输出必须是【PHP 8.1.0 或更高版本】;若显示7.4.x,构造函数属性提升和联合类型语法会直接导致解析失败,页面白屏且无明确错误提示。
TP8任务类必须定义fire(Job $job, $data)方法(不是handle或execute),签名错误会导致静默忽略。
发布时传字符串类名:Queue::push('app\job\SendEmailJob', $data, 'email');监听命令也得匹配队列名:php think queue:listen --queue email
成功后务必手动调用$job->delete();失败可用$job->release(120)延迟重试,避免无限循环消费。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










