查看yii2的rbac源码,发现yii2在检查用户是否具有某个权限或角色是通过一个checkAccess方法来进行校验的,首先loadFromCache加载缓存到成员$this->items、$this->rules、$this->parents变量中而后通过这些变量里面的数据来判断是否有权限。
这个不算奇怪,令我诧异的是在调用getItem方法获取某一个权限/角色时竟然也是调用$this->items来进行获取,然而在$this->getItems方法,获取全部的方法时却是查找的数据库
问题来了:
如果调用$this->items来获取auth_item表中的数据,前提条件是在调用了loadFromCache方法加载以后,并且脚本没有执行结束,$this->items才不为空,否则还是查找的数据库
既然从$this->items里面获取auth_item表中的数据,为什么DbManager类中的getItems方法却又去查找了数据库
我觉得直接从所有的查询数据直接从cache里面获取不就可以了么,如果没有,继续调用数据库操作查询,然后缓存起来不就可以了么,php不是单线程的么,将权限数据存放到变量中好像意义不大