Laravel Passport OAuth 数据库查询改缓存优化
1、oauth_clients 表查询缓存修改
-- 找到路径 project/vendor/laravel/passport/src/Client.php 文件
注释该行代码,不然查询出来存缓存无法获取 secret 值

-- 找到路径 project/vendor/laravel/passport/src/ClientRepository.php 文件,修改 find() 方法,将第一次查询结果存入缓存,后校验 client_id 及 client_secret 直接查询缓存。
<注意:如果经常修改 client_secret ,请记得修改此文件中的 update() 方法,修改完成后删除指定缓存数据>

2、oauth_access_tokens 表插入查询优化
-- 找到路径为 project/vendor/laravel/passport/src/TokenRepository.php 文件,修改 create() 方法,将写入数据库的数据存入 token_id=>attributes 的键值对缓存,将 attributes 数据写入 redis 队列(通过任定时任务异步写入数据库);修改 find() 方法,直接通过 token_id 查询缓存是否存在(这里的缓存过期时间可以直接设置为 token 的有效期时间,就不需要查询数据库了)

3、oauth_refresh_tokens 表操作优化
-- 找到路径为 project/vendor/laravel/passport/src/Bridge/RefreshTokenRepository.php 文件,修改 persistNewRefreshToken() 方法,将直接插入 oauth_refresh_tokens 表的数据写入 redis 队列,后台定时任务异步入库(因 refresh_token 有效期设置一般较长及使用频率不高,故查询 refresh_token 未做缓存优化,如果需要也只是多存一组 String 类型的缓存数据,修改persistNewRefreshToken() 方法存key=>value 缓存,修改 isRefreshTokenRevoked() 方法查询缓存即可)

4、token校验优化
--另外还可以修改文件
project/vendor/league/oauth2-server/src/AuthorizationValidators/BearerTokenValidator.php 中的 validateAuthorization() 方法,直接查询对应 token_id 的缓存是否存在来校验 token 的有效性


5、异步写库


本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
passport 虽然是好用,但是高并发场景下实时操作数据库是真的有性能瓶颈,所以只能通过缓存来做优化
说实话,当我看到要改vendor里面的代码的时候,我就没往下看的欲望了
ClientRepository.php 文件中修改find方法,中Cache::put($cache_key, json_encode($result), Carbon::now()->addDays(1));保存的数据不完整 :joy:这个是什么问题啊,
新增
ClientRepository 类继承于Laravel\Passport\ClientRepository新增
TokenRepository 类继承于Laravel\Passport\TokenRepository在
App\Providers中新建一个PassportServiceProvider继承于Laravel\Passport\PassportServiceProvider重写
registerClientRepository 方法绑定新增的
ClientRepository 类新增一个
registerTokenRepository 方法绑定新增的 ``` TokenRepository 类 ``
重写
register 方法后面的事情, 你该干嘛干嘛. 只需要在 新增
ClientRepository 类TokenRepository 类去重写find($id) 方法实现你自己的缓存方式即可