我从 Laravel 升级4.1
to 5.4
。队列迁移很困难。
首先我注释掉了iron
来自路线的路线:
Route::post('queue/receive', function()
{
return Queue::marshal();
});
然后,我配置了数据库驱动程序并迁移jobs
table:
php artisan queue:table
php artisan migrate
我变了Mail::queue
Mailable 的代码如下:
Mail::to('[email protected] /cdn-cgi/l/email-protection')->send(new ForgotPassword($user->first_name));
我成功同步发送邮件(没有队列)。然后,我切换到队列:
Mail::to('[email protected] /cdn-cgi/l/email-protection')->queue(new ForgotPassword($user->first_name));
最后,我从控制台运行此命令:
php artisan queue:listen
When a Mail::to
行被执行,一行被插入到Jobs
表但未发送邮件。我怎么解决这个问题?
Note: ForgotPassword
is a Mailable
类(应该是Job
班级?)。
同步与同步的主要区别send()
和异步的queue()
,就你的ForgotPassword
与对象有关的一个问题是,当您将对象排队等待发送时,必须将其序列化才能发送到队列,并在队列工作程序处理它时反序列化。
Since send()
工作正常,但发生错误queue()
,我们可以看到排队的作业已被触发并正在尝试处理,很可能在序列化/反序列化中出现错误。
Your ForgotPassword
类可能正在使用SerializesModels
特征,因为这就是 artisan 命令生成新的可邮寄对象的方式。这个特征定义了__sleep() http://php.net/manual/en/language.oop5.magic.php#object.sleep and __wakeup() http://php.net/manual/en/language.oop5.magic.php#object.wakeup方法,它修改序列化和反序列化的工作方式。
当。。。的时候__sleep
方法实现后,PHP 只会序列化该方法返回的变量__sleep
方法。在这种情况下,提供的实现SerializesModels
Trait 使用 Reflection 来遍历类上定义的属性,以提供一种特殊的方式来序列化 Eloquent 模型和集合。
因此,这意味着您的任何变量ForgotPassword
未专门定义为该类的属性的类将不会被序列化,并且在处理排队作业并且该类被反序列化时该类将不可用。这是您的问题最有可能的原因。当您尝试执行作业时,您的未序列化可邮寄实例没有所需的数据,并且失败。
有两种方法可以解决这个问题。首先,如果你的ForgotPassword
实际上不需要序列化任何模型,您可以删除SerializedModels
特征。这将删除__sleep()
定义,然后分配给该类的所有变量(而不仅仅是实际定义的变量)都将被序列化,并且在该类反序列化时也将可用。
第二个选项更合适、更明确,是实际定义您需要的属性ForgotPassword
class.
如果您在类上定义了属性,则可以保留SerializesModels
你班级的特质。但是,如果您实际上没有序列化模型,我会继续删除它。如果不需要,则无需额外的序列化开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)