You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升基于Larapi的Laravel Passport API请求速度?

优化Laravel Passport令牌验证速度的解决方案

我之前也踩过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:27:45