使用Deployer Laravel Recipe部署时Blade模板缓存异常问题
看起来你遇到的问题是Deployer部署Laravel后,视图缓存没有正确更新,导致系统一直指向第一个release的模板文件。这个问题的核心原因是Laravel编译后的视图缓存文件里硬编码了旧release的绝对路径,而Deployer默认共享的storage和bootstrap/cache目录会保留这些旧缓存文件。
下面是一步步的解决方案和排查思路:
先确认问题根源
登录到你的服务器,进入项目的共享storage/framework/views目录,随便打开一个编译后的.php文件,你会看到类似这样的开头:
<?php /** PATH /var/www/your-project/releases/1/resources/views/home.blade.php ENDPATH **/ ?>
如果路径里是releases/1而不是最新的release编号,那就能确定是旧缓存文件在搞鬼。
解决方案1:在Deployer流程中自动清理视图缓存
修改你的deploy.php,添加自定义任务,确保每次部署后清理旧的视图缓存,让新release重新编译模板:
// 定义清理视图缓存的任务 task('laravel:view:clear', function () { run('{{bin/php}} {{release_path}}/artisan view:clear'); }); // 在新release激活为current后执行这个任务 after('deploy:symlink', 'laravel:view:clear');
如果你之前使用过artisan view:cache来预编译视图(这个命令会生成bootstrap/cache/views.php文件),那还要添加重新缓存的任务:
task('laravel:view:cache', function () { run('{{bin/php}} {{release_path}}/artisan view:cache'); }); after('deploy:symlink', 'laravel:view:cache');
这样每次部署完成后,都会自动清理旧缓存并生成新的、指向当前release的视图缓存文件。
解决方案2:调整共享目录配置(可选)
Deployer的Laravel Recipe默认会共享bootstrap/cache目录,如果你不需要共享这个目录(比如每次部署都愿意重新生成配置、路由缓存),可以修改shared_dirs配置,移除它:
set('shared_dirs', [ 'storage', // 移除 'bootstrap/cache',让每个release有自己的缓存目录 ]);
同时,你可以添加一个任务来自动生成所有缓存:
task('laravel:setup-cache', function () { run('{{bin/php}} {{release_path}}/artisan config:cache'); run('{{bin/php}} {{release_path}}/artisan route:cache'); run('{{bin/php}} {{release_path}}/artisan view:cache'); }); after('deploy:vendors', 'laravel:setup-cache');
临时应急方案:手动清理服务器缓存
如果上面的配置还没生效,你可以先手动清理服务器上的旧缓存,立刻让应用加载新模板:
- 登录服务器,进入项目的
current目录(这个是指向最新release的软链接) - 运行
php artisan view:clear - 如果之前用过
view:cache,再运行php artisan view:cache - (可选)直接删除
storage/framework/views下的所有文件,以及bootstrap/cache/views.php文件
这样就能立刻解决当前的问题,之后再配置Deployer任务防止下次复发。
内容的提问来源于stack exchange,提问作者KavonSakul

