当前位置: 首页 > news >正文

laravel 使用异步队列,context带的上下文造成反序列化出问题

2025年5月8日17:03:44
如果你是单个应用,异步递交任务,是在应用内部使用,一般不会发生这样的问题

但是现在app项目是 app是一个应用,admin是一个应用,app吧为了接口性能吧异步任务丢给admin去执行,如果两个应用的。就会出现部分使用

   Context::add('laravel_unique_job_key', 4444);Context::addHidden('eeee', 333333);$tokenInfo = new TokenInfo();Context::add('tokenInfo', $tokenInfo);

如果 增加的 储存在上下文的value部分有对象的值的时候,比如 TokenInfo的在发送 dispatchJob($job);
就会吧 Context里面 datahidden部分会带入 payload

{"displayName": "App\\Jobs\\Job","job": "Illuminate\\Queue\\CallQueuedHandler@call","maxTries": 3,"maxExceptions": null,"failOnTimeout": false,"backoff": null,"timeout": null,"retryUntil": null,"data": {"commandName": "App\\Jobs\\Job","command": "O:27:\"App\\Jobs\\Job\":1:{s:7:\"orderId\";i:221;}"},"illuminate:log:context": {"data": {"tokenInfo": "O:40:\"App\\Http\\TokenInfo\":2:{s:4:\"uuid\";s:0:\"\";s:2:\"id\";i:0;}","zx": "i:11111;"},"hidden": {"eeee": "i:333333;"}}
}

如果admin 没有 TokenInfo的对象就会报错,

RuntimeException: Value is incomplete class: {"__PHP_Incomplete_Class_Name":"App\\Http\\TokenInfo","uuid":"","id":0} 

解决方案:
1,在上游分发异步任务的时候,就不要有 Context 相关的使用 对象类型的数据
2,在下游执行任务的项目,吧存储的对象也复制一份
3,自己封装一个分发方法


if (!function_exists('dispatchJob')) {function dispatchJob(mixed $job){//需要排除的key,这些key可能会影响队列的部分功能,需要先排除$excludeKey = ['laravel_unique_job_cache_store', 'laravel_unique_job_key'];$stay = $all = Context::all();$stayHidden = $allHidden = Context::allHidden();// 判断是否有上下文,如果没有直接 分发jobif (empty($all) && empty($allHidden)) {dispatch($job);} else {//先 forget 所有比不需要的key,dispatch 之后在还给 Context//需要删除的 context key$filterKey = Arr::except($all, $excludeKey);$filterHiddenKey = Arr::except($allHidden, $excludeKey);$keys = array_keys($filterKey);$hiddenKeys = array_keys($filterHiddenKey);// 删除不必要的keyif (!empty($keys)) {foreach ($keys as $key) {Context::forget($key);}}// 删除不必要的隐藏keyif (!empty($hiddenKeys)) {foreach ($hiddenKeys as $hiddenKey) {Context::forgetHidden($hiddenKey);}}//分发任务dispatch($job);//归还上下文if (!empty($keys)) {foreach ($keys as $key) {Context::add($key, $all[$key]);}}if (!empty($hiddenKeys)) {foreach ($hiddenKeys as $hiddenKey) {Context::addHidden($hiddenKey, $allHidden[$hiddenKey]);}}}}
}
http://www.xdnf.cn/news/347383.html

相关文章:

  • sql server限制用户只能访问特定表
  • PWN基础-ROP技术-ret2syscall-64位程序栈溢出利用
  • el-table合并单元
  • 【基础知识】李雅普诺夫方程与李雅普诺夫函数
  • 985高校查重率“隐性阈值”:低于5%可能被重点审查!
  • 从艾米・阿尔文看 CTO 的多面特质与成长路径
  • 英皇娱乐X乐华娱乐携手造星!“英皇乐华青少年艺人培训班”正式启动!
  • 深度学习-159-综述之混合专家模型和推理模型以及工作流和智能体的概念
  • Elastic:如何构建由 AI 驱动的数字客户体验策略
  • 计算机网络-LDP工作过程详解
  • 代码随想录算法训练营第60期第三十天打卡
  • C++之set和map的运用
  • MySQL 数据库
  • AI人工智能在交通物流领域的应用
  • web 自动化之 Selenium 元素定位和浏览器操作
  • 探索 C++ 在行业应用与技术融合中的核心价值
  • Baklib构建AI就绪知识管理体系
  • 湖北理元理律师事务所的企业债务重组实践:挽救实体经济的法律处方
  • B站pwn教程笔记-8
  • 验证码(笔记)
  • IndoorLink 新一代旗舰电子讲解器,四大革新技术开启破冰之旅
  • Spring AI 入门(持续更新)
  • RDD实现单词计数
  • mybatis-plus-join-boot-starter依赖解决 Join 联表查询
  • Linux复习笔记(二) 网络服务配置(samba /DNS)
  • DeepSeek+Kimi实战:PPT制作教程
  • 多智能体学习CAMEL-调用api
  • 阀门产业发展方向报告(石油化工阀门应用技术交流大会)
  • Linux 常用命令 - tftp【简单文件传输协议】
  • 超大规模SoC后仿真流程与优化