队列传参问题

今天遇到一个问题,请各位大佬给我答疑解惑:bowtie:

$user = app(User::class)->first();
$user->uid = 123;
dispatch(new UserJob($user));  //调用队列
class UserJob extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    public $tries = 2;

    public $user;


    public function __construct($user)
    {
        $this->user = $user;
        dump($this->user);
    }

    public function handle()
    {
        dd($this->user);
    }

第一个dump打印的是我赋值后的值
队列传参问题

而在 handle 里再dd() 的时候 uid 又变回原本的值了
队列传参问题

这个为啥呀? 队列对这个对象参数做了什么操作?

jocker
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
godruoyi
最佳答案

再讲一个 job 放进 Laravel 队列时,Laravel 会将改 job Serialize 化,期间会丢失非 public 的数据,这也是为什么设置的 payload 数据要设置为 public 的原因。

public $user;

说回来,Laravel 在消费队列数据时,会尝试先 unSerialize,如果 payload 是 model,Laravel 还会尝试根据 id 重新查询一次数据库,并用新纪录填充 $user。

所有你在 job 里 __contruct 看到的数据是调用时你传给他的,而 handl 里的是重新反查出来的。

3年前 评论
24K大白羊 3年前
zhangrongwang 3年前
24K大白羊 3年前
讨论数量: 5
godruoyi

再讲一个 job 放进 Laravel 队列时,Laravel 会将改 job Serialize 化,期间会丢失非 public 的数据,这也是为什么设置的 payload 数据要设置为 public 的原因。

public $user;

说回来,Laravel 在消费队列数据时,会尝试先 unSerialize,如果 payload 是 model,Laravel 还会尝试根据 id 重新查询一次数据库,并用新纪录填充 $user。

所有你在 job 里 __contruct 看到的数据是调用时你传给他的,而 handl 里的是重新反查出来的。

3年前 评论
24K大白羊 3年前
zhangrongwang 3年前
24K大白羊 3年前
jenkincei

入队列会序列化,并且只保留id,反序列化从数据库按id取出,所以入队列前要存库。

3年前 评论

坐等大神解答

3年前 评论

SerializesModels 删掉试试呢

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!