我从 Laravel 升级 4.1
至 5.4
.队列迁移很困难。
首先,我评论了iron
从路线路线:
Route::post('queue/receive', function()
{
return Queue::marshal();
});
然后,我配置了数据库驱动程序并迁移了
jobs
table :php artisan queue:table
php artisan migrate
我改了
Mail::queue
像这样的Mailables代码:Mail::to('person@gmail.com')->send(new ForgotPassword($user->first_name));
我成功地同步发送邮件(无队列)。然后,我切换到队列:
Mail::to('person@gmail.com')->queue(new ForgotPassword($user->first_name));
最后,我从控制台运行这个命令:
php artisan queue:listen
当
Mail::to
行被执行,一行被插入到Jobs
表,但邮件未发送。我怎么解决这个问题?注:
ForgotPassword
是 Mailable
类(应该是 Job
类?)。
最佳答案
同步send()
的主要区别和异步 queue()
,至于您的 ForgotPassword
object 而言,就是当你将对象排队发送时,必须将其序列化才能发送到队列中,并在队列 worker 处理它时进行反序列化。
自 send()
工作正常,但 queue()
出现错误,我们可以看到排队的作业被触发并被尝试处理,序列化/反序列化很可能存在错误。
您的 ForgotPassword
类可能正在使用 SerializesModels
trait,因为这就是 artisan 命令生成新的可邮寄对象的方式。这个特征定义了 __sleep()
和 __wakeup()
方法,修改序列化和反序列化的工作方式。
当__sleep
方法实现后,PHP 只会序列化 __sleep
返回的变量方法。在这种情况下,由 SerializesModels
提供的实现trait 使用反射来遍历定义在类上的属性,以提供一种特殊的方式来序列化 Eloquent 模型和集合。
因此,这意味着您 ForgotPassword
上的任何变量未明确定义为类上的属性的类将不会被序列化,并且在处理排队作业且类未序列化时将不可用。这是您的问题最可能的原因。当您的作业被尝试时,您的未序列化的可邮寄实例没有它需要的数据,并且失败了。
有两种方法可以解决这个问题。首先,如果您的 ForgotPassword
实际上不需要序列化任何模型,您可以删除 SerializedModels
特征。这将删除 __sleep()
从类中定义,然后分配给类的所有变量,而不仅仅是那些实际定义的变量,将被序列化,并且在类被反序列化时也将可用。
第二个选项更合适也更明确,是在 ForgotPassword
上实际定义您需要的属性。类(class)。
如果您在类上定义属性,则可以保留 SerializesModels
你类的特质。但是,如果您实际上并未序列化模型,我会继续将其删除。如果您不需要,则不需要额外的序列化开销。
关于laravel - 对 Laravel 5 队列发送邮件感到困惑 (Laravel 5.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42331471/