laravel 使用队列报错Serialization of 'Closure' is not allowed

在使用laravel中的队列的时候,有可能会出现以下这个报错

laravel 使用队列报错Serialization of 'Closure' is not allowed

 

 

 从给出的错误信息上分析,说不预序我们序列化闭包,其实这个问题的原因在于,我们在jobs中的任务类中的构造函数接受的参数有问题,我们需要分析一下几个问题

1、什么情况下使用jobs任务类中的构造函数?

2、什么情况下使用jobs任务类中的handle方法?

3、任务类中的laravel 使用队列报错Serialization of 'Closure' is not allowedSerializesModels是什么作用

 

 

首先问题1什么情况下程序执行jobs任务类中的构造函数?这个很简单当然是我们在new jobs/任务类的时候会执行构造函数,当然可以在new 任务类的时候传递参数

问题2什么情况下执行任务类中的handle?官方文档这样介绍的

 laravel 使用队列报错Serialization of 'Closure' is not allowed

这就很明显了,也就是说当我们的队列被消费的时候才会执行handle

问题3 SerializesModels有什么作用呢?

SerializesModels trait,Eloquent 模型将会在任务被执行时优雅地序列化和反序列化。如果你的队列任务在构造函数中接收 Eloquent 模型,只有模型的主键会被序列化到队列,当任务真正被执行的时候,队列系统会自动从数据库中获取整个模型实例

简单的理解就是SerializesModels把我们传递的参数序列化和反序列化,但是他序列化的值存到了jobs表中的attempts字段值所以文章开头时的问题就找到了根源,我们在构造函数中接收的参数,或者定义的参数有没有出现new xxx(),因为这种类的调用,SerializesModels是没有办法序列化的例如有没有出现

laravel 使用队列报错Serialization of 'Closure' is not allowed

 

 如果在构造函数中出现这种调用,那么把他注视掉,问题就可以解决了,如果需要使用这个类,可以在handle方法中调用

上一篇:SaltSack 中Job管理


下一篇:bootstrap-treeview 树形菜单带复选框以及级联选择