Laravel生产环境启动慢、接口卡顿主因是未正确使用config:cache和route:cache;需确保配置中显式调用env()、路由仅用控制器方法,并配合with()字段精简、cursorPaginate()分页、带因子缓存key等优化手段。

生产环境 Laravel 启动慢、接口响应卡,八成不是代码写得差,而是 config:cache 和 route:cache 没跑,或者跑了但用法错了。
为什么 config:cache 和 route:cache 必须开,又不能乱开
这两个命令把配置和路由注册逻辑固化成单个 PHP 数组文件,跳过每次请求时的 require 和动态解析。不开的话,Laravel 每次都要扫描 config/ 全部 PHP 文件、重跑 RouteServiceProvider::map(),白多出 5–15ms 启动开销。
但开错会直接导致功能异常:
-
php artisan config:cache生成bootstrap/cache/config.php,它只读取配置文件里显式调用env()的变量;比如你.env里写了APP_DEBUG=true,但config/app.php里没写env('APP_DEBUG'),那这个值根本不会进缓存 -
php artisan route:cache只支持控制器方法路由;闭包路由(如Route::get('/', function () { }))会直接报错退出;Route::apiResource()是安全的 - 改了
config/app.php或新增了routes/web.php里的路由,必须手动php artisan config:clear && php artisan config:cache,否则变更不生效
with() 预加载怎么用才不翻车
with() 是防 N+1 的第一道防线,但它本身有陷阱:预加载整张关联表却只用一两个字段;或在循环里嵌套 with() 导致重复加载。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 只取必要字段:
Post::with(['user:id,name,email'])->get(),避免拉回password_hash这类敏感或大字段 - 条件性加载用
loadMissing():$post->loadMissing('author'),比无脑with()更省——它只在$post->author还没被加载过时才查库 - 别在 Blade 模板循环里写
{{ $post->user->name }}同时又没预加载;Debugbar 的 “Queries” 面板里出现一串相同 SQL,基本就是 N+1 已发生 -
with()只对 Eloquent 关系有效,不能用于普通字段或手动join的结果
分页和大数据量处理别踩 offset 死锁坑
paginate() 看似方便,但底层靠 LIMIT OFFSET,数据量一过十万,MySQL 就得扫大量无用行,越往后翻页越慢;chunk(1000) 表面简单,实际靠 OFFSET 实现,在高并发或写入频繁的表上极易卡住,且跳过已删行后页码会错乱。
- 超十万级数据,优先用
cursorPaginate():确保排序字段(如id或created_at)已建索引,前端必须传真实游标值,不可手动构造 - 批量处理几万条记录,改用
chunkById(1000):它用主键范围查询,更稳定;但要求主键是带索引的整型id,UUID 或字符串主键不适用 - 如果业务强依赖时间顺序(如按
created_at处理),可建联合索引(created_at, id),再手写WHERE created_at > ? AND id > ?分页逻辑
缓存 key 设计和过期时间不能拍脑袋
硬编码 key 或统一设 24 小时过期,轻则缓存雪崩,重则返回脏数据。
- key 必须带可变因子:
Cache::remember('posts_list_'.$request->input('category').'_'.$request->input('page'), 3600, ...),否则不同分类请求全打到同一个 key 上 - 过期时间按数据更新频率分级:用户个人资料缓存 10 分钟,站点全局配置缓存 1 小时,热点榜单缓存 5 分钟
- 高频只读数据(如分类树、热门文章列表)适合用
Cache::remember();但注意:缓存失效策略写错,比不缓存还伤性能
最常被忽略的是缓存与配置的联动关系:改了 .env 不重跑 config:cache,新值就永远进不了运行时;用了 env() 在代码里动态读变量,缓存后直接失效——这些细节不盯住,优化效果会断层。










