队列传参问题

今天遇到一个问题,请各位大佬给我答疑解惑: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
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
godruoyi
最佳答案

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

public $user;

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

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

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

坐等大神解答

2年前 评论

SerializesModels 删掉试试呢

2年前 评论
godruoyi

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

public $user;

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

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

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

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

2年前 评论

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