路由缓存、配置缓存、视图缓存
Laravel 框架级别的缓存命令能显著减少每个 HTTP 请求的启动开销。config:cache 把 100 个配置文件合并成一个,route:cache 把路由编译成优化的 PHP 代码——这些都是生产部署的必要步骤。
各缓存命令说明
| 命令 | 效果 | 适用环境 |
|---|---|---|
config:cache | 合并所有 config/*.php 为单文件 | 生产 |
route:cache | 编译路由表为优化 PHP 代码 | 生产 |
view:cache | 预编译所有 Blade 模板 | 生产(可选) |
event:cache | 缓存事件-监听器映射 | 生产(有 Event Discovery 时) |
optimize | 执行以上所有 | 生产 |
optimize:clear | 清空以上所有缓存 | 开发、部署回滚 |
config:cache
# 生产环境:缓存所有配置
php artisan config:cache
# 把 config/ 下所有文件合并成 bootstrap/cache/config.php
# 效果:每次请求不再扫描 config/ 目录,从单文件读取
# 开发环境:清除缓存(修改 .env 或 config 后必须执行)
php artisan config:clear
# ⚠️ 重要:config:cache 后 env() 函数不再工作!
# 必须确保所有代码用 config() 而不是 env()
route:cache
# 编译路由(生产环境提速 5-10 倍)
php artisan route:cache
# 生成 bootstrap/cache/routes-v7.php
# 清除路由缓存
php artisan route:clear
# ⚠️ 限制:包含闭包的路由不能被缓存!
# 错误用法(导致 route:cache 失败):
Route::get('/test', function () { return 'test'; }); // 闭包路由
# 正确做法:所有路由都指向控制器
Route::get('/test', [TestController::class, 'index']);
view:cache
# 预编译所有 Blade 模板(减少首次访问时的编译时间)
php artisan view:cache
# 把 Blade 模板编译成 storage/framework/views/*.php
# 清除视图缓存
php artisan view:clear
optimize:一键执行所有缓存
# 等同于 config:cache + route:cache + view:cache + event:cache
php artisan optimize
# 清空全部
php artisan optimize:clear
部署脚本:完整的生产部署流程
#!/bin/bash
# deploy.sh — 生产环境部署脚本
set -e # 遇错停止
echo "🚀 开始部署 TaskFlow..."
# 1. 拉取最新代码
git pull origin main
# 2. 安装依赖(不包含开发依赖)
composer install --no-dev --optimize-autoloader
# 3. 清除旧缓存
php artisan optimize:clear
# 4. 运行数据库迁移
php artisan migrate --force # --force 跳过生产环境确认
# 5. 生成框架缓存
php artisan optimize
# 6. 重启队列 Worker(让新代码生效)
php artisan queue:restart
# 7. 重启 Reverb(如果有 WebSocket)
php artisan reverb:restart 2>/dev/null || true
echo "✅ 部署完成!"
性能调优:响应时间分析
// Laravel Debugbar(开发环境)
// 安装后在浏览器底部显示:查询数量、内存使用、时间分解
composer require barryvdh/laravel-debugbar --dev
// Telescope(开发+Staging 环境)
// 在 /telescope 查看所有请求详情:查询、缓存命中、队列、邮件
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrate
查询优化速查
// 1. 使用 select() 减少数据传输
Task::select(['id', 'title', 'status', 'user_id'])->get(); // 不取所有列
// 2. 分块处理大数据集(避免 OOM)
Task::chunk(500, function ($tasks) {
foreach ($tasks as $task) { /* 处理 */ }
});
// 或 lazy:
Task::lazy()->each(function (Task $task) { /* 处理 */ });
// 3. insert 批量插入(避免 N+1 写入)
DB::table('tasks')->insert($tasksArray); // 一条 INSERT 插入多行
// 4. 使用 pluck() 只取单列
$userIds = Task::distinct()->pluck('user_id'); // 不加载整个模型
// 5. exists() 代替 count()(性能更好)
if (Task::where('user_id', $userId)->exists()) {
// 比 count() > 0 更快
}
// 6. 使用 updateOrCreate 代替先查再写
Task::updateOrCreate(
['external_id' => $externalId],
['title' => $title, 'status' => $status]
);
下一节:Laravel Octane:Swoole / RoadRunner——传统 PHP-FPM 每个请求都要重启应用(加载框架、注册服务)。Octane 让 Laravel 常驻内存,性能提升 5-10 倍。