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

如何缩短Laravel API响应时间?缓存优化后仍有延迟差异

问题描述

我原本用下面的代码拉取数据,但Postman查询时响应耗时过长:

public function getAllItems(Request $request)
{
    $type = $request->input('type');
    
    $query = Item::query();
    
    if ($type === 'series') {
        $query->where('is_series', true);
    } elseif ($type === 'movies') {
        $query->where('is_series', false);
    }

    $items = $query->get();
    
    return response()->json($items, 200, [], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}

为缩短响应时间,我引入了缓存机制,同时在响应中加入了查询起止时间统计:

public function getAllItems(Request $request)
{
    $type = $request->input('type');

    $cacheKey = 'all_items_' . $type;

    $startTime = microtime(true);

    if (Cache::has($cacheKey)) {
        $items = Cache::get($cacheKey);
        
        $endTime = microtime(true);
        $executionTime = ($endTime - $startTime);
        
        return response()->json([
            'isCache' => true,
            'time' => $executionTime . ' seconds',
            'data' => $items,
            ], 200, [], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    } else {
        $query = Item::query();
        
        if ($type === 'series') {
            $query->where('is_series', true);
        } elseif ($type === 'movies') {
            $query->where('is_series', false);
        }

        $items = $query->get();

        Cache::put($cacheKey, $items, now()->addMinutes(60));
        
        $endTime = microtime(true);
        $executionTime = ($endTime - $startTime);
        
        return response()->json([
            'isCache' => false,
            'time' => $executionTime . ' seconds',
            'data' => $items,
            ], 200, [], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    }
}

但我统计的响应时间与Postman显示的耗时存在较大差异,请问如何进一步加快API响应速度?


解决方案

先说明时间差异的原因

你代码里统计的executionTime仅计算了函数内计时开始到准备返回响应前的逻辑耗时,未包含以下关键环节:

  • HTTP请求到达服务器前的网络传输时间
  • Laravel框架启动、路由解析、中间件执行的时间
  • 响应从服务器返回客户端的网络传输时间
  • Postman自身的请求处理时间
    因此和Postman显示的总耗时存在差距是正常现象。

进一步优化API响应速度的具体方案

1. 优化数据库查询(非缓存场景)

  • 给is_series字段加索引:在数据库中为items表的is_series字段创建普通索引,直接加快WHERE条件的查询效率。
  • 只查询必要字段:如果不需要返回Item模型的所有字段,用select('id', 'name', ...)指定返回字段,减少数据传输和序列化开销。
  • 避免N+1查询:若Item关联了其他模型,用with()预加载关联数据,防止序列化时触发额外数据库查询。

2. 优化缓存策略

  • 提前预热缓存:不要等用户请求才生成缓存,通过Artisan命令或定时任务提前将series和movies类型的数据缓存好,让用户首次请求直接命中缓存。
  • 更换缓存存储:将默认的文件缓存换成Redis或Memcached这类内存缓存,大幅提升缓存读写速度。
  • 优化缓存键:给缓存键添加版本前缀,比如all_items_v1_$type,后续数据结构变更时可批量失效缓存,避免脏数据。

3. 优化响应处理

  • 用cursor()替代get():如果数据量极大,get()会一次性加载所有数据到内存,cursor()通过游标分批处理,降低内存占用并提升响应速度。
  • 精简JSON序列化选项:若业务不需要JSON_UNESCAPED_UNICODE和JSON_UNESCAPED_SLASHES,可直接移除,减少序列化耗时;若必须保留,确认是否为刚需。
  • 启用Gzip压缩:在Nginx/Apache服务器或Laravel中间件中开启Gzip压缩,大幅减小响应体体积,加快网络传输速度。

4. 框架层面优化

  • 开启OPcache:在PHP配置中启用OPcache,缓存编译后的PHP代码,减少框架启动和代码解析时间。
  • 移除冗余中间件:检查当前API路由组的中间件,去掉不需要的环节(比如Session、CSRF验证)。
  • 使用Laravel Octane:若服务器支持,用Octane运行Laravel,让框架常驻内存,避免每次请求重新启动,显著提升响应速度。

内容的提问来源于stack exchange,提问作者spo spo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:00:25