Symfony能否实现缓存自动清理?适配未维护的Symfony4开发环境
Symfony 4 DEV环境缓存自动清理解决方案
以下3种方案均无需切换生产环境,仅做最小改动即可生效:
方案1:内置缓存过期配置(零额外脚本改动)
Symfony 4本身支持给缓存池设置默认TTL(生存时间),直接修改项目配置即可实现自动回收过期缓存:
- 打开
config/packages/dev/framework.yaml文件,新增/修改以下配置:
framework: cache: default_ttl: 86400 # 单位为秒,这里配置为1天过期,可自行调整时长 pools: cache.app: default_lifetime: 86400 cache.system: default_lifetime: 604800 # 系统缓存可以设置长一点,比如7天
修改后执行php bin/console cache:clear生效,后续所有写入的缓存都会自动附带过期时间,到期后会被Symfony自动回收
方案2:操作系统定时任务+缓存清理命令(最稳妥补丁方案)
完全不需要改动项目代码,依靠系统定时任务清理旧缓存:
步骤1:编写清理脚本
在项目根目录新建clean_dev_cache.sh文件,内容如下:
#!/bin/bash # 只保留最近7天的缓存文件,可自行调整天数 find /你的项目实际路径/var/cache/dev -type f -mtime +7 -delete # 也可以选择直接调用Symfony自带清理命令,两种方式按需二选一 # php /你的项目实际路径/bin/console cache:clear --env=dev
- 给脚本加执行权限:
chmod +x clean_dev_cache.sh
步骤2:添加定时任务
执行crontab -e添加定时规则,比如每天凌晨2点执行清理:
0 2 * * * /你的脚本实际路径/clean_dev_cache.sh >> /你的项目实际路径/var/log/cache_clean.log 2>&1
可自行调整定时规则,比如每12小时执行一次就改成0 */12 * * *
方案3:自定义缓存轮转服务(类日志轮转效果)
如果需要实现完全和日志轮转一致的每日独立缓存、自动删除旧版本的效果,可以自行开发简单的命令:
- 新建
src/Command/RotateDevCacheCommand.php文件:
<?php namespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Filesystem\Filesystem; class RotateDevCacheCommand extends Command { protected static $defaultName = 'app:rotate-dev-cache'; private $cacheDir; private $keepDays = 7; // 保留最近7天的缓存,可自行调整 public function __construct(string $projectDir) { parent::__construct(); $this->cacheDir = $projectDir . '/var/cache/dev'; } protected function execute(InputInterface $input, OutputInterface $output): int { $fs = new Filesystem(); $dateSuffix = date('Ymd'); $rotatedDir = $this->cacheDir . '_' . $dateSuffix; // 重命名当前缓存目录为带日期后缀的版本 if ($fs->exists($this->cacheDir)) { $fs->rename($this->cacheDir, $rotatedDir); } // 删除超过保留天数的旧缓存目录 $cacheParentDir = dirname($this->cacheDir); $oldCaches = glob($cacheParentDir . '/dev_*'); foreach ($oldCaches as $oldCache) { if (is_dir($oldCache) && time() - filemtime($oldCache) > $this->keepDays * 86400) { $fs->remove($oldCache); } } $output->writeln('Dev cache rotated successfully'); return Command::SUCCESS; } }
- 配合crontab每天凌晨执行一次
php bin/console app:rotate-dev-cache即可,首次执行后Symfony会自动生成新的dev缓存目录,不会影响业务运行。
内容的提问来源于stack exchange,提问作者Genarito
相关产品推荐
相关产品推荐

