donjan-deng / hyperf-casbin

适配 Hyperf 的开源访问控制框架Casbin
Apache License 2.0
88 stars 21 forks source link

多进程下,hyperf有bug! #8

Closed liminworks closed 3 years ago

liminworks commented 3 years ago

hyperf开启多进程时,每次修改(添加角色权限)只更新当前进程的model属性值,别的进程没有更新。Enforcer::enforce() 这个方法还是获取进程启动时加载的mode值。

liminworks commented 3 years ago

3.7版本中。

donjan-deng commented 3 years ago

使用redis adapter 和 watcher https://github.com/php-casbin/php-casbin/issues/81 但redis adapter我没测试过,后续考虑测试后包含在本库中。

自行使用Enforcer::loadPolicy()刷新策略也会造成一定的数据库压力

方便的话打包一个最小实现出来,我测试下其他解决方法

donjan-deng commented 3 years ago

@liminworks 试下dev版本,给个反馈,我测试已经没问题了

composer require donjan-deng/hyperf-casbin:dev-master

liminworks commented 3 years ago

@liminworks 试下dev版本,给个反馈,我测试已经没问题了

composer require donjan-deng/hyperf-casbin:dev-master

image

dev版本这样改多进程和多实例肯定是没有问题的,,因为每个协程进来都会重新加载数据库的全部数据,每次请求的协程id是不一样的,,所以相当于每个请求都要从数据库查一遍,,性能开销很大,,,另外测试循环添加角色权限接口的时候,等待时间过长,每个都要查一次数据库扫描全表,

liminworks commented 3 years ago

为何不用redis缓存呢?更新carsbin表的时候删除缓存key,,这样多实例启动的时候每次就能从数据库读取数据,,没有删除缓存也就是carsin无修改的时候,直接从缓存读取数据。

donjan-deng commented 3 years ago

@liminworks