当我将可发送的laravel排队等待15分钟后执行时,如下所示:
Mail::to($user)->later(now()->addMinutes(15), new EmailConfirm($user));
Laravel将EmailConfrim
类存储在payload
表的jobs
列中。
如果我执行将类名EmailConfirm
更改为ConfirmEmail
的发布,则在15分钟后执行代码时,我将收到以下错误消息:
prod.ERROR: Illuminate\Mail\SendQueuedMailable::handle(): The script
tried to execute a method or access a property of an incomplete object.
Please ensure that the class definition
"App\Mail\Mailables\EmailConfrim" of the object you are trying to
operate on was loaded _before_ unserialize() gets called or provide an
autoloader to load the class definition
此错误告诉我有效负载中定义的类不再存在。
我一直在想的一个解决方案是在laravel生成的app_version_number
表中添加一个jobs
。然后,在运行该版本的所有作业之前,我不会让我的laravel工人死亡:
php artisan queue:restart
。
这将花费我一些时间来可靠地进行编码,因为这将特定于我们的产品环境。我该如何更雄辩地解决这个问题?
答案 0 :(得分:3)
我会暂时将两个类都留在代码库中,进行部署,然后15分钟(或工作所耗费的最大时间)以后再推动移除。
答案 1 :(得分:3)
此答案与https://stackoverflow.com/a/54314953/2191572 但非常相似,我建议通过扩展名维护EmailConfirm
,以避免在队列出现问题时进行双重维护:
class EmailConfirm extends ConfirmEmail
{
// This is just a shell/alias/wrapper/whatever for the real class
}
class ConfirmEmail
{
function __construct( $param )
{
// Maintain this class
}
}
15分钟的等待时间还算不错,但是如果您的队列连续几天都没有赶上并且您需要多次更改ConfirmEmail
会怎样?