在生产环境部署中,php artisan optimize 命令实际执行了 composer dump-autoload --optimize 并删除 bootstrap/cache/services.php 文件,这一机制在 2025 年 10 月 16 日的源码解读中被确认。
原因分析
Laravel 默认每次请求需动态解析 routes/web.php 和 config/ 目录下的全部定义,导致路由匹配缓慢及多次 require 调用开销。根据 2026 年 4 月 15 日的技术分析,未缓存时框架需执行 ServiceProvider 的逐行执行与闭包解析过程,而缓存后可直接通过 O(1) 查找完成匹配,显著减少路由匹配开销。
解决方案
1. 生成配置缓存
将所有 config/ 目录下的 PHP 配置文件合并并序列化为单个文件。执行命令:php artisan config:cache。生成的缓存文件位于 bootstrap/cache/config.php,适合生产环境部署(2026 年 4 月 9 日资料)。
2. 生成路由缓存
确认所有路由均定义在 routes/web.php 或 routes/api.php 中,且无闭包函数。确保 APP_ENV=production 且 APP_DEBUG=false,否则命令将被拒绝执行。运行 php artisan route:cache,验证缓存是否生成可检查 bootstrap/cache/routes-v7.php 是否存在(版本号可能为 v8、v9 等)。
3. Laravel 12+ 增强优化
若已升级至 Laravel 12 或更高版本,可运行 composer update 同步核心组件后,执行增强版缓存命令:php artisan route:cache:optimize。该命令会生成带索引哈希表的缓存文件,不兼容任何含运行时条件判断的路由(2026 年 4 月 15 日资料)。
注意事项
- 闭包路由限制:路由缓存不兼容闭包路由,若部署失败,检查
php artisan route:list --compact输出是否全部为控制器方法格式,而非 Closure。 - CLI 环境预热:在队列监听器或计划任务中,Laravel 不自动加载路由缓存,需在
app/Providers/AppServiceProvider.php的boot()方法末尾添加$this->app->useCachedRoutes();。 - 缓存清除顺序:修改路由后必须先执行
php artisan route:clear再重新缓存,否则新路由无效。配置修改后需执行php artisan config:clear删除bootstrap/cache/config.php。
参考来源
来源:Laravel 框架配置缓存、路由缓存与性能优化配置实践 - 2026 年 4 月 9 日更新
来源:Laravel 怎样利用缓存提升路由解析速度 - 2026 年 4 月 15 日收录
来源:Laravel artisan optimize 源码解读 - 2025 年 10 月 16 日撰