orm根据ID查询,返回了其它ID的结果.

1. 运行环境

1). 当前使用的 Laravel 版本?

Laravel Framework 8.83.27

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.1.19

php-fpm 版本:

3). 当前系统

macos 11.7.10

4). 业务环境

CentOS 7.9

5). 相关软件版本

gateway-worker 3.1.1

2. 问题描述?

laravel orm查询的数据,返回的结果不正确.
业务场景需要使用websocket,就使用了常驻内存的gateway-worker搭配laravel同时使用,
通过gateway-worker提交的查询,有时候返回的结果很奇怪,比如根据token获取a,b用户的uid,取出来的user信息有时候不正确, 会返回其它用户的信息.经打印sql语句发现,用于查询的uid是准确的,但是框架输出的实际执行语句,却是不正确的. 而重启gateway-worker服务后,查询的结果又能够正常返回.
因为是小概率触发, 没法准确定位原因, 请教下见多识广的大家 , 这是属于laravel orm的bug, 还是属于gateway-worker常驻内存导致的变量污染问题呢? laravel结合这种常驻内存的框架应该怎么避免这种情况?

    $selfUser = User::query()->with('userInfo')->where(['uuid' => $selfUuid])->first();
   info('$selfUuid='.$selfUuid);
   info($selfUser);


    $targetUser = User::query()->with('userInfo')->where(['uuid' => $targetUuid])->first();
   info('$targetUuid='.$targetUuid);
   info($targetUser);

3. 您实际得到的结果?

框架打印的实际执行sql如下:

   [2023-12-12 14:17:11] time: 0.08 ms; sql: select * from `user` where (`uuid` = "956498") and `user`.`deleted_at` is null limit 1;
    [2023-12-12 14:17:11] time: 2.27 ms; sql: select * from `user_info` where `user_info`.`uuid` in ("371006") and `user_info`.`deleted_at` is null;
    [2023-12-12 14:17:11] time: 0.05 ms; sql: select * from `user` where (`uuid` = "724129") and `user`.`deleted_at` is null limit 1;
    [2023-12-12 14:17:11] time: 2.2 ms; sql: select * from `user_info` where `user_info`.`uuid` in ("371006") and `user_info`.`deleted_at` is null;

日志里面返回的异常结果如下:

   [2023-12-12 14:17:11] prod.INFO: $selfUuid=956498
    [2023-12-12 14:17:11] prod.INFO: {"id":3,"uuid":371006,"register_device_type":0,"register_device_imei":"E0B993E56CC","register_ip":"221.234.178.221","created_at":"2023-12-07 16:18:35","updated_at":"2023-12-12 12:18:36","deleted_at":null,"user_info":null}
    [2023-12-12 14:17:11] prod.INFO: $targetUuid=724129
    [2023-12-12 14:17:11] prod.INFO: {"id":3,"uuid":371006,"register_device_type":0,"register_device_imei":"E0B993E56CC","register_ip":"221.234.178.221","created_at":"2023-12-07 16:18:35","updated_at":"2023-12-12 12:18:36","deleted_at":null,"user_info":null}
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

比如根据 token 获取 a,b 用户的 uid, 取出来的 user 信息有时候不正确,会返回其它用户的信息。

从你这段话 我猜你应该使用了 laravelrequest 了。

laravel request 是单例的, 不能用于 常驻型,甚至数据库你也不能用,要自己 new 一个 connection

参考: 在多个协程间共用一个连接


修改:

  1. 使用 gateway-workerrequest 来获取 token
  2. 数据库每次使用都要new 一个新连接。
4个月前 评论
SinceJuly 4个月前
讨论数量: 4

比如根据 token 获取 a,b 用户的 uid, 取出来的 user 信息有时候不正确,会返回其它用户的信息。

从你这段话 我猜你应该使用了 laravelrequest 了。

laravel request 是单例的, 不能用于 常驻型,甚至数据库你也不能用,要自己 new 一个 connection

参考: 在多个协程间共用一个连接


修改:

  1. 使用 gateway-workerrequest 来获取 token
  2. 数据库每次使用都要new 一个新连接。
4个月前 评论
SinceJuly 4个月前

没这样用过,gateway-worker可以只用来推送数据,laravel安装GatewayClient去发送消息,www.workerman.net/doc/gateway-work... 这是文档说明。

4个月前 评论
SinceJuly 4个月前

比如根据 token 获取 a,b 用户的 uid, 取出来的 user 信息有时候不正确,会返回其它用户的信息。

从你这段话 我猜你应该使用了 laravelrequest 了。

laravel request 是单例的, 不能用于 常驻型,甚至数据库你也不能用,要自己 new 一个 connection

参考: 在多个协程间共用一个连接


修改:

  1. 使用 gateway-workerrequest 来获取 token
  2. 数据库每次使用都要new 一个新连接。
4个月前 评论
SinceJuly 4个月前

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