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}
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

比如根据 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个月前

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