如何提升基于Larapi的Laravel Passport API请求速度?
我之前也踩过Passport令牌验证拖慢API的坑,结合实际排查和优化经验,给你几个可行的方向试试:
检查数据库索引是否缺失
Passport验证令牌时会频繁查询oauth_access_tokens表,以及关联的用户表。如果这些表的关键字段没有索引,每次查询都会触发全表扫描,耗时会剧增。重点检查:oauth_access_tokens表的id字段(令牌验证的核心查询字段)oauth_access_tokens表的user_id和expires_at字段
你可以用数据库的慢查询日志,或者Laravel的Telescope工具(执行php artisan telescope:watch),看看验证阶段有没有耗时超过几百毫秒的SQL语句。
缓存令牌验证结果
Passport默认每次请求都会去数据库查询令牌信息,你可以给验证结果加上缓存层,减少重复查询。比如自定义一个带缓存的TokenRepository:// 在App\Providers\AuthServiceProvider的boot方法中添加 use Laravel\Passport\TokenRepository; use Illuminate\Cache\CacheManager; public function boot() { $this->registerPolicies(); Passport::routes(); // 绑定带缓存的TokenRepository $this->app->bind(TokenRepository::class, function ($app) { $originalRepo = $app->make(TokenRepository::class); $cache = $app->make(CacheManager::class); // 自行实现CachedTokenRepository,封装缓存逻辑 return new \App\Repositories\CachedTokenRepository($originalRepo, $cache); }); }其中
CachedTokenRepository可以封装原有的查询方法:先从缓存取数据,取不到再查数据库,然后把结果缓存几分钟(注意要和令牌过期时间匹配)。切换到无状态JWT令牌模式
Passport默认的个人访问令牌是存储在数据库里的,每次验证都要查库。如果你的业务场景允许,可以切换到无状态的JWT令牌模式(比如Passport的Password Grant或Client Credentials Grant的JWT版本),这样令牌验证只需要解密签名,不需要访问数据库,速度会大幅提升。排查数据库连接延迟
虽然你说其他项目正常,但可以单独测试下应用服务器到数据库服务器的连接耗时。比如在应用服务器上执行mysql -h [数据库IP] -u [用户名] -p -e "SELECT NOW();",看看执行耗时。如果延迟超过几十毫秒,可能是网络层面的问题导致每次Passport查库变慢。排除不必要的认证请求
检查路由配置,确保只有需要认证的请求才经过auth:api中间件。有些公开接口或者静态资源请求如果被错误加上了认证中间件,会导致不必要的令牌验证,拖慢整体速度。
内容的提问来源于stack exchange,提问作者Kaio Da Dalt

