【问题标题】:Laravel Queues and changes to job classesLaravel 队列和对作业类的更改
【发布时间】:2019-01-21 06:38:48
【问题描述】:

我有一个使用 redis 和 Laravel (5.1) 队列的项目。

在我们的案例中,在部署后,特定作业开始失败,导致 Redis 中积压了数万个作业。在特定作业类中的代码中发现逻辑问题后,部署了一个修复程序,该修复程序还删除了一个类范围的变量。

但是,由于类被序列化并存储在 redis 中,当排队的作业重试排队的作业时,由于 Laravel 工作人员试图访问现在不存在的类范围变量而失败。我通过重新部署变量来解决这个问题。

以后如何避免这种情况?有没有办法刷新序列化的作业代码,或者有更好的方法来捕捉这种错误? Laravel 在 Redis 中使用的序列化对象方法在队列项和我宁愿避免的 Laravel 代码之间创建了依赖关系。

【问题讨论】:

标签: php laravel redis


【解决方案1】:

这在很大程度上是一个未记录的问题。最近对文档的补充说明了以下内容,可以通过抛出的异常和模型类布尔值来帮助解决问题:

将 Eloquent 模型注入作业时,它会在放入队列之前自动序列化,并在处理作业时恢复。但是,如果在作业等待工作人员处理时删除了模型,您的作业可能会因 ModelNotFoundException 而失败。

为方便起见,您可以选择通过将作业的 deleteWhenMissingModels 属性设置为 true 来自动删除缺少模型的作业:

/**
 * Delete the job if its models no longer exist.
 *
 * @var bool
 */
public $deleteWhenMissingModels = true;

在此处阅读上下文:

https://laravel.com/docs/5.7/queues#ignoring-missing-models

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多