队列传参问题

今天遇到一个问题,请各位大佬给我答疑解惑: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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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

坐等大神解答

3年前 评论

SerializesModels 删掉试试呢

3年前 评论
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年前 评论

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