我从Laravel 4.1
升级到5.4
。队列迁移很困难。
首先,我评论了路线的iron
路线:
Route::post('queue/receive', function()
{
return Queue::marshal();
});
然后,我配置了数据库驱动程序并迁移了jobs
表:
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
类?)。
答案 0 :(得分:2)
就send()
对象而言,同步queue()
和异步ForgotPassword
之间的主要区别在于,当您将对象排队以进行发送时,必须将其序列化要发送到队列,并在队列工作程序处理它时进行反序列化。
由于send()
工作正常,但queue()
发生错误,我们可以看到排队的作业被触发并尝试处理,序列化中很可能出错/反序列化。
您的ForgotPassword
类可能正在使用SerializesModels
特征,因为这是artisan命令生成新的可邮寄对象的方式。此特征定义了__sleep()
和__wakeup()
方法,这些方法修改了序列化和反序列化的工作方式。
当实现__sleep
方法时,PHP将仅序列化__sleep
方法返回的变量。在这种情况下,SerializesModels
特征提供的实现使用Reflection来遍历在类上定义的属性,以提供一种特殊的方法来序列化Eloquent模型和集合。
因此,这意味着ForgotPassword
类上未明确定义为类属性的任何变量都不会被序列化,并且在处理排队作业时它将不可用class是反序列化的。这是您问题的最可能原因。当您的作业被尝试时,您的未序列化的可邮寄实例没有所需的数据,并且失败。
有两种方法可以解决这个问题。首先,如果您的ForgotPassword
实际上不需要序列化任何模型,则可以删除SerializedModels
特征。这将从类中删除__sleep()
定义,然后在类上分配的所有变量(不仅仅是那些实际定义的变量)将被序列化,并且在类被反序列化时也可用。
第二个选项,更合适,更明确,是实际定义ForgotPassword
类所需的属性。
如果您在课程中定义属性,则可以在课程中保留SerializesModels
特征。但是,如果您实际上没有序列化模型,我会继续将其删除。如果您不需要,则无需额外的序列化开销。
答案 1 :(得分:0)
您可能需要编辑计算机上项目文件夹中的现有.env文件。 查找.env文件,通过sublime文本打开并编辑它。
使用您要发送邮件的电子邮件ID和密码进行编辑。
答案 2 :(得分:0)
您可以使用laravel队列发送邮件,请参阅示例
定义作业
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.localgame);
致电职位
@Override
public void onBackPressed() {
Log.d("myTag", "DETECTED BACK");
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
Log.d("myTag", "THERE WAS SOMETHING IN THE FRAGSTACK");
getSupportFragmentManager().popBackStack();
getSupportFragmentManager().beginTransaction().commit();
} else {
super.onBackPressed();
}
}
}
<强> .ENV 强>
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.settlers.hd, PID: 12710
java.lang.IllegalArgumentException: No view found for id 0x7f070025 (com.settlers.hd:id/fragment_container) for fragment GameManager{c2a128d #0 id=0x7f070025 GameManager}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:930)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:764)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1527)
at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:485)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5551)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
注意强>