如何缩短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
相关产品推荐
相关产品推荐

