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}
比如根据 token 获取 a,b 用户的 uid, 取出来的 user 信息有时候不正确,会返回其它用户的信息。
从你这段话 我猜你应该使用了
laravel
的request
了。laravel request
是单例的, 不能用于 常驻型,甚至数据库你也不能用,要自己new
一个connection
。参考: 在多个协程间共用一个连接
修改:
gateway-worker
的request
来获取token
new
一个新连接。