如何在Laravel Forge中仅清除指定站点/环境的缓存?
解决Laravel Forge多环境缓存清除冲突问题
核心原因是你的生产和预发布环境共享了同一个缓存存储(无论是文件、Redis还是其他类型),执行php artisan cache:clear会清除整个存储的缓存,导致互相影响。以下是几种可靠的解决办法:
1. 给每个环境配置独立的缓存存储路径/数据库
文件缓存场景
修改config/cache.php中文件驱动的路径,根据当前环境区分:
'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data/' . env('APP_ENV')), ],
确保两个环境的.env文件中APP_ENV分别设为production和staging,这样缓存文件会分别存在storage/framework/cache/data/production和staging目录下。
Redis缓存场景
如果用Redis,给不同环境分配独立的数据库:
修改config/database.php中的Redis连接配置:
'cache' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', '6379'), 'database' => env('APP_ENV') === 'production' ? 0 : 1, ],
然后在config/cache.php中指定使用这个缓存连接:
'default' => env('CACHE_DRIVER', 'redis'), 'stores' => [ 'redis' => [ 'driver' => 'redis', 'connection' => 'cache', ], ],
2. 执行清除命令时指定对应环境
在部署脚本中,给cache:clear命令加上--env参数,明确指定当前环境:
- 生产环境部署脚本:
php artisan cache:clear --env=production
- 预发布环境部署脚本:
php artisan cache:clear --env=staging
这个命令会加载对应环境的配置,只会清除该环境配置下的缓存内容,前提是你已经按步骤1配置了环境独立的缓存存储。
3. 使用缓存前缀(备选方案)
如果不想改动存储路径/数据库,可以给每个环境设置独立的缓存前缀:
在各自的.env文件中添加:
- 生产环境:
CACHE_PREFIX=prod_ - 预发布环境:
CACHE_PREFIX=staging_
然后修改config/cache.php中的前缀配置:
'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'),
这种方式下,默认的cache:clear还是会清除整个存储,但你可以自定义一个Artisan命令来只删除对应前缀的缓存键。不过相比前两种方法,这种需要额外开发,不如直接隔离存储来得直接。
内容的提问来源于stack exchange,提问作者Craig Lovelock
相关产品推荐
相关产品推荐

