laravel - 对 Laravel 5 队列发送邮件感到困惑 (Laravel 5.4)

标签 laravel laravel-5 laravel-queue laravel-mail

我从 Laravel 升级 4.15.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表,但邮件未发送。我怎么解决这个问题?

注:ForgotPasswordMailable类(应该是 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/

相关文章:

Laravel 5.3 - 单个页面上的多个分页不起作用

laravel-5 - Laravel 5 将其他对象绑定(bind)到契约(Contract)

Laravel 队列与 AWS Elastic Beanstalk

Laravel 队列作业不会更新到最新代码

laravel - 查看一秒内处理了多少个Job?

Laravel 模型返回未定义的属性::$attribute

Laravel望远镜-禁止使用403

javascript - Laravel + VueJs : MPA architecture

php - Laravel 获取登录尝试失败次数

mysql - (axios) HTTP POST 请求两分钟后失败,Laravel 5 + VueJS