生产环境laravel卡顿主因是本地磁盘i/o瓶颈、n+1查询、静态资源未走cdn及未启用配置/路由/视图缓存;需切换storage至s3、预加载关联、分离cdn磁盘、固化缓存。

切断本地磁盘I/O瓶颈
生产环境Laravel响应卡顿,八成以上源于文件写入阻塞PHP进程——日志、缓存、上传临时文件全挤在本地磁盘上,高并发时I/O队列直接堆满。
打开config/filesystems.php,将'default' => 'public'改为'default' => 's3'。
确认'disks'数组中已定义's3'配置块,且.env中必须存在四个环境变量:AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION、AWS_BUCKET——【缺少任一变量会导致Storage::put()静默失败,无异常抛出】。
执行php artisan storage:link后无需再运行——该命令仅对public磁盘生效,云存储磁盘不需要符号链接。
规避N+1查询陷阱
遍历100个用户并逐个访问$user->posts,实际发出101条SQL,这是Laravel应用变慢最隐蔽也最常见的根源。
方法一:用with()在主查询阶段预加载关联数据
复制AI写代码
User::with('posts.comments')->get();
方法二:嵌套深时用点号语法一次性声明
User::with('posts.tags', 'profile')->get();
方法三:只查必要字段,避免拉回大文本字段拖慢网络和内存
User::with(['posts' => function ($q) { $q->select('id', 'title', 'user_id'); }])->get();
强制URL生成走CDN域名
图片、视频等静态资源若仍从应用服务器吐出,哪怕数据库查询优化到5ms,用户也会卡在HTTP 200响应前。
第一步:在config/filesystems.php的'disks'数组内新增图片专用磁盘:'cdn_images',驱动设为s3,'bucket'指向CDN回源桶(如myapp-images-prod),并设置'url'为CDN域名(如https://img.example.com)。
第二步:同样新增视频专用磁盘:'cdn_videos',但'bucket'指向独立视频桶(如myapp-videos-prod),'url'设为另一CDN域名(如https://vid.example.com)。
第三步:这两个磁盘必须启用'visibility' => 'public'——S3对象权限需设为PublicRead,且CDN回源策略必须允许匿名GET请求。
第四步:控制器中显式指定磁盘并调用url()
$path = Storage::disk('cdn_images')->put('avatars/123.jpg', $file);
$cdnUrl = Storage::disk('cdn_images')->url($path); // 返回 https://img.example.com/avatars/123.jpg
固化配置与路由缓存
上线后频繁执行php artisan config:clear或route:clear,等于让所有请求都去重新编译配置/路由文件,CPU尖刺、首字节延迟(TTFB)飙升都是常态。
执行php artisan config:cache生成bootstrap/cache/config.php,跳过.env解析与数组合并过程。
执行php artisan route:cache生成bootstrap/cache/routes-v7.php,绕过所有Route::调用与闭包注册。
执行php artisan view:cache预编译Blade模板,消除首次访问时的解析开销。











