如何使用命令行清除 laravel 中的缓存?
Posted
技术标签:
【中文标题】如何使用命令行清除 laravel 中的缓存?【英文标题】:How can I clear the cache in laravel using command line? 【发布时间】:2016-11-10 10:06:40 【问题描述】:我正在使用 Redis
在 Laravel 5.2 中缓存查询/路由。
我有 3 个环境在同一个 Web 服务器上运行,即“生产”、“暂存”和“开发”。
对于每个环境,我设置了不同的缓存 prefix
值,以允许我将缓存链接到不同的环境。
在config/cache.php
文件中我更改了行
'prefix' => 'laravel',
到
'prefix' => ENV('CACHE_PREFIX', 'laravel'),
然后在我的.env
文件中,我为每个环境添加了这样的前缀
开发者
CACHE_PREFIX="LaravelDev"
暂存
CACHE_PREFIX="LaravelStaging"
用于生产
CACHE_PREFIX="LaravelProduction"
我知道我可以像这样从命令行清除缓存
php artisan cache:clear
但是上面的代码会清除我所有环境的缓存。
我只想清除“LaravelDev”的缓存,不理会“LaravelStaging”和“LaravelProduction”
如何清除特定环境的缓存?
【问题讨论】:
【参考方案1】:您可以使用不同的 redis 数据库,而不是使用 CACHE_PREFIX。例如:生产 => 1,暂存 => 2,开发 => 3。 如果您想更熟悉它,请使用此链接:
-
What's the Point of Multiple Redis Databases?
List All Redis Databases
因此,在每个环境(生产/阶段/开发)的 .env 文件中,您需要定义不同的 REDIS_CACHE_DB env 值。
到该行的链接使用此变量 https://github.com/laravel/laravel/blob/2a2522d8824c0852e30a7e3e07d46a543eb4b33d/config/database.php#L142 。 .env 示例:
.env.production
REDIS_CACHE_DB=1
.env.stage
REDIS_CACHE_DB=2
.env.development
REDIS_CACHE_DB=3
更改环境变量后不要忘记清除配置缓存:https://laravel.com/docs/7.x/configuration#configuration-caching
希望这会有所帮助!
【讨论】:
【参考方案2】:cache:clear
artisan 命令在当前连接器上调用flush
函数。由于缓存引擎因功能而异,我认为不可能有选择地使密钥过期,从而保持缓存 API 的通用性。 Redis 等引擎提供了此类功能,但 memcached 等引擎不提供。
如果您使用的是 Redis,您可以修改默认连接器以对 flush()
方法使用“SCAN / DEL”命令。这仍然不会很有效。
如果您的应用程序正确使用缓存刷新,则不会导致任何问题,因为缓存会自行重建。您永远不要期望缓存中有一些数据,因为它可能会过期。
【讨论】:
当我执行 php artisan cache:clear 时,它会清除 Redis 中的所有内容。我刚刚又测试了一遍。我看到的问题是使用该应用程序的用户将收到不匹配令牌错误,因为会话也被清除。 解决方案是在 Staging 和 Dev 环境中为会话使用不同的存储类型,因此清除缓存不会影响实时用户。 我不能创建一个命令行来执行以下代码吗? $redis = 缓存::getRedis(); $keys = $redis->keys(Cache::getPrefix() . "*"); foreach($keys as $key) 缓存::forget($key); 当然,只要您的缓存中没有数千个可能导致其超出可用内存的键,这应该可以工作。直接与 Redis 对话,您可以使用 SCAN / MATCH / COUNT 命令组合。以上是关于如何使用命令行清除 laravel 中的缓存?的主要内容,如果未能解决你的问题,请参考以下文章