您如何处理laravel队列中的类名更改?

时间:2019-01-22 19:07:54

标签: php laravel supervisord

当我将可发送的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

这将花费我一些时间来可靠地进行编码,因为这将特定于我们的产品环境。我该如何更雄辩地解决这个问题?

2 个答案:

答案 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会怎样?