Laravel使用队列发送邮件时报stdClass::$subscription未定义错误
问题根因
该问题核心原因有两个,优先级从高到低排列:
- 队列进程加载的是旧版本代码:Laravel 队列 Worker 启动后会将所有代码载入内存,后续代码修改不会自动同步到运行中的队列进程。你同步发信正常说明 Web 侧运行的是最新代码,但是队列进程还在执行旧版本逻辑,旧版本中大概率存在
$subscription属性的调用代码。 SerializesModelsTrait 与入参类型不兼容:你在 Mailable 类中引入的SerializesModels是为 Eloquent 模型序列化设计的,你传入的是自定义stdClass对象,序列化反序列化过程中可能触发异常的属性检测逻辑,导致报错。- 额外隐性问题:你构造函数的注释标注入参为数组类型,但实际传入的是
stdClass对象,弱类型虽然不会直接报错,但会提升类型相关的异常概率。
解决步骤
- 重启队列进程
在项目根目录执行命令重启队列,强制加载最新代码:
php artisan queue:restart
如果使用 supervisor 管理队列,执行命令后 supervisor 会自动拉起新的队列进程,旧进程执行完当前任务后自动退出。
- 清理所有缓存
依次执行命令清理项目残留缓存:
php artisan config:clear php artisan view:clear php artisan cache:clear
- 代码兼容性优化(可选建议)
如果后续不想出现同类序列化问题,可以做二选一调整:
- 控制器传入数组替代
stdClass,对应调整 Mailable 类中属性调用的语法为数组格式,避免序列化异常。
// 控制器代码调整示例 $mail = [ 'to' => ['email' => 'someemail@gmail.com', 'name' => 'Name test'], 'subject' => 'Subject test', 'body' => 'Body test' ]; \Mail::queue(new \App\Mail\NewCustomer($mail));
- 确定不需要序列化 Eloquent 模型的前提下,直接移除
NewCustomer类中的SerializesModelsTrait 即可。
- 极端情况排查
如果执行完上述步骤仍然报错,直接打开服务器上/home/sm/public_html/app/Mail/NewCustomer.php文件,核对第45行的实际代码,确认是否存在本地未同步到服务器的$subscription调用逻辑。
内容的提问来源于stack exchange,提问作者Linesofcode
相关产品推荐
相关产品推荐

